react-native-wheely
react-native-wheely copied to clipboard
New Arch Support RN 0.76
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());
}