如何在混合React-native应用程序中传递初始属性

时间:2018-10-07 17:10:14

标签: android react-native

我的Android应用程序是一个混合程序,一些活动是React Native(RN 0.57.1​​),而其他活动则不是(使用androidX)

我的应用程序类声明为

class MyApplication: extends Application  {
...

}

我正在关注本文,以将初始属性传递给react-native JS端

https://dev.to/ryohlan/how-to-pass-initial-props-from-android-native-2k2

本文以及我发现的所有其他方法都建议将 ReactActivityDelegate 引入到Activity中。 并在那里设置初始属性。

那需要从ReactActivity派生特定的活动,这就是我所做的:

    public class ReactNative1Activity extends ReactActivity implements DefaultHardwareBackBtnHandler {

    /* previously inherited from
androidx.appcompat.app.AppCompatActivity */

    ...
    }

但是,ReactActivityDelegate希望我的整个应用程序是ReactApplication,而不仅仅是特定的活动。

从使用的类型转换可以明显看出这一点

  /**
   * Get the {@link ReactNativeHost} used by this app. By default, assumes
   * {@link Activity#getApplication()} is an instance of {@link ReactApplication} and calls
   * {@link ReactApplication#getReactNativeHost()}. Override this method if your application class
   * does not implement {@code ReactApplication} or you simply have a different mechanism for
   * storing a {@code ReactNativeHost}, e.g. as a static field somewhere.
   */
  protected ReactNativeHost getReactNativeHost() {
    return ((ReactApplication) getPlainActivity().getApplication()).getReactNativeHost();
  }

在使用委托时进行了这些更改,我开始遇到运行时错误

  

3:08:51.706 9817-9817 / com.mytestapp.develop E / AndroidRuntime:FATAL   例外:主要       流程:com.mytestapp.develop,PID:9817       java.lang.RuntimeException:无法恢复活动{com.mytestapp.develop / com.mytestapp.ReactNative1Activity}:   java.lang.ClassCastException:com.mytestapp.MyApplication不能为   转换为com.facebook.react.ReactApplication           在android.app.ActivityThread.performResumeActivity(ActivityThread.java:3581)           在android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3621)           在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2862)           在android.app.ActivityThread.-wrap11(未知来源:0)           在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1589)           在android.os.Handler.dispatchMessage(Handler.java:106)           在android.os.Looper.loop(Looper.java:164)           在android.app.ActivityThread.main(ActivityThread.java:6494)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:438)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)        原因:java.lang.ClassCastException:com.mytestapp.MyApplication无法强制转换为   com.facebook.react.ReactApplication           在com.facebook.react.ReactActivityDelegate.getReactNativeHost(ReactActivityDelegate.java:71)           在com.facebook.react.ReactActivityDelegate.onResume(ReactActivityDelegate.java:104)           在com.facebook.react.ReactActivity.onResume(ReactActivity.java:64)           在com.mytestapp.ReactNative1Activity.onResume(ReactNative1Activity.java:219)           在android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1355)           在android.app.Activity.performResume(Activity.java:7117)           在android.app.ActivityThread.performResumeActivity(ActivityThread.java:3556)           在android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3621)           在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2862)           在android.app.ActivityThread.-wrap11(未知来源:0)           在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1589)           在android.os.Handler.dispatchMessage(Handler.java:106)           在android.os.Looper.loop(Looper.java:164)           在android.app.ActivityThread.main(ActivityThread.java:6494)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:438)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

我不认为,我希望我的整个应用程序继承自android.app.Application之外的其他东西。

有可能使其正常工作吗?

1 个答案:

答案 0 :(得分:1)

弄清楚了。 无需使用ReactActivityDelegate即可将initialProperties创建到自定义组件中。

因此,无需使我的Activity继承自ReactActivity,因此,无需让我的应用实现ReactApplication接口。

相反,每个集成React的现有Andorid应用程序都需要覆盖特定活动的onCreate并创建ReactRootView (我已经在做)。

按照 https://facebook.github.io/react-native/docs/integration-with-existing-apps

ReactRootView.startApplication

作为最后一个参数,

采用了他们所谓的initialProperties

与Bundle的 恰好是相同的,它会由ReactAcitityDelegate的自定义(重写)getLaunchOption返回

因此,将具有您自己的自定义属性的Bundle传递到ReactRootView.startReactApplication中-起作用。

@Override
protected onCreate ( ... )
{
....

        Bundle initialProperties=getMyOwnLaunchOptions(mydata1,,myData2);
        mReactRootView.startReactApplication(mReactInstanceManager,
                 "MyRNAppExample",
                initialProperties);
        setContentView(mReactRootView);


}