react-native-wheely icon indicating copy to clipboard operation
react-native-wheely copied to clipboard

New Arch Support RN 0.76

Open remacr opened this issue 11 months ago • 0 comments

When enabling the new arch on 0.76 the component fails with the following error:

Exception thrown when executing UIFrameGuarded
                                                                                                    java.lang.NullPointerException: Attempt to invoke virtual method 'com.facebook.react.uimanager.events.EventDispatcher com.facebook.react.uimanager.UIManagerModule.getEventDispatcher()' on a null object reference
                                                                                                    	at com.tron.ReactWheelCurvedPicker.<init>(ReactWheelCurvedPicker.java:38)
                                                                                                    	at com.tron.ReactWheelCurvedPickerManager.createViewInstance(ReactWheelCurvedPickerManager.java:39)
                                                                                                    	at com.tron.ReactWheelCurvedPickerManager.createViewInstance(ReactWheelCurvedPickerManager.java:23)
                                                                                                    	at com.facebook.react.uimanager.ViewManager.createViewInstance(ViewManager.java:190)
                                                                                                    	at com.facebook.react.uimanager.ViewManager.createView(ViewManager.java:122)
                                                                                                    	at com.facebook.react.fabric.mounting.SurfaceMountingManager.createViewUnsafe(SurfaceMountingManager.java:679)
                                                                                                    	at com.facebook.react.fabric.mounting.SurfaceMountingManager.preallocateView(SurfaceMountingManager.java:1086)
                                                                                                    	at com.facebook.react.fabric.mounting.mountitems.PreAllocateViewMountItem.execute(PreAllocateViewMountItem.java:63)
                                                                                                    	at com.facebook.react.fabric.mounting.MountItemDispatcher.executeOrEnqueue(MountItemDispatcher.java:387)
                                                                                                    	at com.facebook.react.fabric.mounting.MountItemDispatcher.dispatchPreMountItems(MountItemDispatcher.java:366)
                                                                                                    	at com.facebook.react.fabric.FabricUIManager$DispatchUIFrameCallback.doFrameGuarded(FabricUIManager.java:1393)
                                                                                                    	at com.facebook.react.fabric.GuardedFrameCallback.doFrame(GuardedFrameCallback.kt:22)
                                                                                                    	at com.facebook.react.modules.core.ReactChoreographer.frameCallback$lambda$1(ReactChoreographer.kt:60)
                                                                                                    	at com.facebook.react.modules.core.ReactChoreographer.$r8$lambda$nSkFhrr5T7rop_XKwzlLov4NLLw(Unknown Source:0)
                                                                                                    	at com.facebook.react.modules.core.ReactChoreographer$$ExternalSyntheticLambda0.doFrame(D8$$SyntheticClass:0)
                                                                                                    	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1035)
                                                                                                    	at android.view.Choreographer.doCallbacks(Choreographer.java:845)
                                                                                                    	at android.view.Choreographer.doFrame(Choreographer.java:775)
                                                                                                    	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022)
                                                                                                    	at android.os.Handler.handleCallback(Handler.java:938)
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                    	at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                    	at android.os.Looper.loop(Looper.java:288)
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:7839)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

Here are the modifications I applied to enable the usage with the new arch. npx patch-package react-native-wheel-pick

diff --git a/node_modules/react-native-wheel-pick/android/src/main/java/com/tron/ReactWheelCurvedPicker.java b/node_modules/react-native-wheel-pick/android/src/main/java/com/tron/ReactWheelCurvedPicker.java
index 60777b8..6d4917a 100644
--- a/node_modules/react-native-wheel-pick/android/src/main/java/com/tron/ReactWheelCurvedPicker.java
+++ b/node_modules/react-native-wheel-pick/android/src/main/java/com/tron/ReactWheelCurvedPicker.java
@@ -1,26 +1,12 @@
 package com.tron;

-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.LinearGradient;
-import android.graphics.Paint;
-import android.graphics.Shader;
-import android.os.SystemClock;
-import android.util.AttributeSet;
-
-// import android.util.Log;
-
 import com.aigestudio.wheelpicker.WheelPicker;
-import com.aigestudio.wheelpicker.WheelPicker.OnWheelChangeListener;
 import com.facebook.react.bridge.Arguments;
 import com.facebook.react.bridge.ReactContext;
 import com.facebook.react.bridge.WritableMap;
-import com.facebook.react.uimanager.UIManagerModule;
 import com.facebook.react.uimanager.events.Event;
-import com.facebook.react.uimanager.events.EventDispatcher;
 import com.facebook.react.uimanager.events.RCTEventEmitter;

-import java.util.Date;
 import java.util.List;

 /**
@@ -28,59 +14,49 @@ import java.util.List;
  */
 public class ReactWheelCurvedPicker extends WheelPicker {

-    private final EventDispatcher mEventDispatcher;
+    private final ReactContext mReactContext;
     private List<Object> mValueData;

-    //private int mState;
-
     public ReactWheelCurvedPicker(ReactContext reactContext) {
         super(reactContext);
-        mEventDispatcher = reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher();
+        this.mReactContext = reactContext;
+
         setOnWheelChangeListener(new OnWheelChangeListener() {
             @Override
-            public void onWheelScrolled(int offset) {
-            }
+            public void onWheelScrolled(int offset) {}

             @Override
             public void onWheelSelected(int position) {
-                // Log.d("onWheelSelected", "Wheel Selected");
                 if (mValueData != null && position < mValueData.size()) {
-                    mEventDispatcher.dispatchEvent(
-                        new ItemSelectedEvent(getId(), mValueData.get(position)));
+                    dispatchEvent(new ItemSelectedEvent(getId(), mValueData.get(position)));
                 }
             }

             @Override
-            public void onWheelScrollStateChanged(int state) {
-                //mState = state;
-            }
+            public void onWheelScrollStateChanged(int state) {}
         });
     }

-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    private void dispatchEvent(ItemSelectedEvent event) {
+        if (mReactContext.hasActiveCatalystInstance()) {
+            mReactContext.getJSModule(RCTEventEmitter.class)
+                    .receiveEvent(getId(), event.getEventName(), event.serializeEventData());
+        }
     }

     public void setValueData(List<Object> data) {
         mValueData = data;
     }
-
-    public void getState() {
-    //public int getState() {
-        //return state;
-    }
 }

 class ItemSelectedEvent extends Event<ItemSelectedEvent> {

     public static final String EVENT_NAME = "wheelCurvedPickerPageSelected";
-
     private final Object mValue;

     protected ItemSelectedEvent(int viewTag, Object value) {
         super(viewTag);
-        mValue = value;
+        this.mValue = value;
     }

     @Override
@@ -93,13 +69,12 @@ class ItemSelectedEvent extends Event<ItemSelectedEvent> {
         rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
     }

-    private WritableMap serializeEventData() {
+    public WritableMap serializeEventData() {
         WritableMap eventData = Arguments.createMap();

-        Class mValueClass = mValue.getClass();
-        if (mValueClass == Integer.class) {
+        if (mValue instanceof Integer) {
             eventData.putInt("data", (Integer) mValue);
-        } else if (mValueClass == String.class) {
+        } else if (mValue instanceof String) {
             eventData.putString("data", mValue.toString());
         }


remacr avatar Jan 29 '25 17:01 remacr