簡體   English   中英

將數據從Android活動發送到React Native

[英]Send data from Android activity to React Native

我正在處理本機android活動中的意圖,並希望將在意圖中獲得的數據發送到react本機部分。 請原諒我拙劣的術語/解釋-關於Android開發,我是一個完整的初學者。

我已經嘗試按照以下指南進行操作: https : //facebook.github.io/react-native/docs/native-modules-android.html#sending-events-to-javascript ,但我一直無法獲得主要的反應上下文。 因此,意圖已經超出了應用程序的范圍,我想獲取意圖數據並啟動應用程序。 例如,主視圖應僅顯示意圖的文本。

這是我發送事件的方式:

public class CustomActivity extends ReactActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    WritableMap map = Arguments.createMap();
    map.putString("messageString", "CustomMessage");

    try {
      getReactInstanceManager().getCurrentReactContext()
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit("customEvent", map);
    } catch (Exception e){
      Log.e("ReactNative", "Caught Exception: " + e.getMessage());
    }
}

這引發了異常

引發異常:嘗試在空對象引用上調用虛擬方法'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactContext.getJSModule(java.lang.Class)'

我沒有為活動定義自定義布局,而是想使用主應用程序的上下文。

因此似乎失敗了,因為沒有及時創建上下文。 為了解決這個問題,我添加了一個忙於等待上下文創建的等待。

while (getReactInstanceManager().getCurrentReactContext() == null);  // Busy wait.
getReactInstanceManager().getCurrentReactContext()
    .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
    .emit("defineIntent", map);

如果有人知道處理等待的更好方法,請在此處進行更新。 謝謝!

我在生產中遇到了

    Fatal Exception: java.lang.RuntimeException
            Unable to resume activity {minibar.android/minibar.android.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactContext.getJSModule(java.lang.Class)' on a null object reference
    Caused by java.lang.NullPointerException
            Attempt to invoke virtual method 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactContext.getJSModule(java.lang.Class)' on a null object reference

因此解決方案是檢查reactContext是否不為null,否則創建偵聽器並等待它:

ReactInstanceManager reactInstanceManager = getReactNativeHost().getReactInstanceManager();
ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
if(reactContext != null) {
    reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit("url", params);
} else {
    reactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
        @Override
        public void onReactContextInitialized(ReactContext context) {
            context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("url", params);
            reactInstanceManager.removeReactInstanceEventListener(this);
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM