RN問題java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getId()'
錯誤資訊:
java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.view.View.getId()’ on a null object reference
java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.view.View.getId()’ on a null object reference
at com.facebook.react.uimanager.NativeViewHierarchyManager.dropView(NativeViewHierarchyManager.java:536)
at com.facebook.react.uimanager.NativeViewHierarchyManager.manageChildren(NativeViewHierarchyManager.java:430)
at com.facebook.react.uimanager.UIViewOperationQueue$ManageChildrenOperation.execute(UIViewOperationQueue.java:179)
at com.facebook.react.uimanager.UIViewOperationQueue$1.run(UIViewOperationQueue.java:821)
at com.facebook.react.uimanager.UIViewOperationQueue.flushPendingBatches(UIViewOperationQueue.java:928)
at com.facebook.react.uimanager.UIViewOperationQueue.accessDispatchUIFrameCallback.doFrameGuarded(UIViewOperationQueue.java:988)
at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(GuardedFrameCallback.java:29)
at com.facebook.react.modules.core.ReactChoreographerFrameCallbackCallbackRecord.run(Choreographer.java:1024)
at android.view.Choreographer.doCallbacks(Choreographer.java:838)
at android.view.Choreographer.doFrame(Choreographer.java:766)
at android.view.ChoreographerMethodAndArgsCaller.run(Zygote.java:246)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.view.View.getId()’ on a null object reference
at com.facebook.react.bridge.ReactContext.handleException(ReactContext.java:311)
at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(GuardedFrameCallback.java:31)
at com.facebook.react.modules.core.ReactChoreographerFrameCallbackCallbackRecord.run(Choreographer.java:1024)
at android.view.Choreographer.doCallbacks(Choreographer.java:838)
at android.view.Choreographer.doFrame(Choreographer.java:766)
at android.view.ChoreographerMethodAndArgsCaller.run(Zygote.java:246)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
錯誤原因是:
RN的android原生bug,這個node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java檔案的dropView函式:
if (view instanceof ViewGroup && viewManager instanceof ViewGroupManager) {
ViewGroup viewGroup = (ViewGroup) view;
ViewGroupManager viewGroupManager = (ViewGroupManager) viewManager;
for (int i = viewGroupManager.getChildCount(viewGroup) - 1; i >= 0; i--) {
View child = viewGroupManager.getChildAt(viewGroup, i);
if (mTagsToViews.get(child.getId()) != null) {
dropView(child);
}
}
viewGroupManager.removeAllViews(viewGroup);
}
中的這段程式碼 if (mTagsToViews.get(child.getId()) != null) 判斷沒有對child做空判斷,導致問題可能出現崩潰。
解決