React Native(Android原生模块):如何在另一个类中获取ReactContext?

8

我希望从另一个类中调用继承自ReactContextBaseJavaModule的MyCustomModuleClass中的方法。

MyCustomModule.java

public class MyCustomModule extends ReactContextBaseJavaModule {

  private ReactContext mReactContext;

  public MyCustomModule(ReactApplicationContext reactContext) {
    super(reactContext);
    mReactContext = reactContext;
  }

  @Override
  public String getName() {
    return "CustomModule";
  }


    private void sendEvent(String eventName, Object params) {
        mReactContext
            .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
            .emit(eventName, params);
    }    
}

我正在尝试这个...

OtherClass.java

public class OtherClass extends AnotherClass {

    @Override
    protected void eventOccurred(Context context) {
        MyCustomModule RNC = new MyCustomModule(?);//-> Can't call without ReactContext
        RNC.sendEvent("CustomEvent", ObjectData); 
    }   
}

抱歉,我对Java一无所知,有人能帮我吗?

在OtherClass中是否有办法获取ReactContext?


看起来你没有在 MyCustomModule 上调用有效的构造函数。也许这只是你在尝试创建简单示例时犯的一个笔误。我不明白为什么你不能这样做。试一试吧。 - startoftext
是的,我一直都做错了。让我更新我的问题。 - antihate
我通过另一种方式解决了我的问题,使用了LocalBroadcastManager。 - antihate
@antihate - 你介意分享一下你的解决方案吗?这个问题让我抓狂了。。 - Justin Finkelstein
此问题在以下问题中获得了更多反馈:https://github.com/facebook/react-native/issues/5846 - Ali Ghanavatian
1个回答

8

这是我在一个扩展了FirebaseMessagingService类的中完成它的方式。

public class MyPushListener extends FirebaseMessagingService {

  @Override
  public void onMessageReceived(JSONObject message, JSONObject content){

    MainApplication application = (MainApplication) this.getApplication();

    ReactNativeHost reactNativeHost = application.getReactNativeHost();
    ReactInstanceManager reactInstanceManager = reactNativeHost.getReactInstanceManager();
    ReactContext reactContext = reactInstanceManager.getCurrentReactContext();

    if (reactContext != null) {
      WritableNativeArray params = new WritableNativeArray();
      params.pushString(message.toString());
      reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
          .emit("EVENT_HAS_TRIGGERED", params);
    }
  }
}

Source


我也用RN 0.71.8做了这个,但是我看到了一个警告,警告内容是getCurrentReactContext();这个方法只应该在测试中或者私有范围内访问。 - Satheesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,