如何在混合 React 本机应用中传递初始属性



我的Android应用程序是混合的,有几个活动是React Native(RN 0.57.1(,其他不是(使用androidX(

我的应用程序类被声明为

class MyApplication: extends Application  {
...
}

我正在按照这篇文章将初始属性传递给反应原生 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.development 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 at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3581( at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3621( at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2862( at android.app.ActivityThread.-wrap11(未知来源:0( at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589( at android.os.Handler.dispatchMessage(Handler.java:106( at android.os.Looper.loop(Looper.java:164( at android.app.ActivityThread.main(ActivityThread.java:6494( at java.lang.reflect.Method.invoke(Native Method( at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438( at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807( 原因:java.lang.ClassCastException: com.mytestapp.MyApplication 无法强制转换为 com.facebook.react.ReactApplication at com.facebook.react.ReactActivityDelegate.getReactNativeHost(ReactActivityDelegate.java:71( at com.facebook.react.ReactActivityDelegate.onResume(ReactActivityDelegate.java:104( at com.facebook.react.ReactActivity.onResume(ReactActivity.java:64( at com.mytestapp.ReactNative1Activity.onResume(ReactNative1Activity.java:219( at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1355( at android.app.Activity.performResume(Activity.java:7117( at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3556( at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3621( at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2862( at android.app.ActivityThread.-wrap11(未知来源:0( at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589( at android.os.Handler.dispatchMessage(Handler.java:106( at android.os.Looper.loop(Looper.java:164( at android.app.ActivityThread.main(ActivityThread.java:6494( at java.lang.reflect.Method.invoke(Native Method( at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438( at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807(

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

这有可能让它工作吗?

想通了。 无需使用 ReactActivityDelegate 将 initialProperties 创建到自定义组件中。

因此,不需要让我的活动继承自 ReactActivity,因此,也不需要让我的应用程序实现 ReactApplication 接口。

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

根据 https://facebook.github.io/react-native/docs/integration-with-existing-apps

ReactRootView.startApplication

作为最后一个参数,接受他们所谓的初始属性

这恰好与由自定义(覆盖(getLaunch返回的捆绑包相同 反应AcitityDelegate的选项

因此,将带有您自己的自定义属性的捆绑包传递到 ReactRootView.startReactApplication 中 - 有效。

@Override
protected onCreate ( ... )
{
....
Bundle initialProperties=getMyOwnLaunchOptions(mydata1,,myData2);
mReactRootView.startReactApplication(mReactInstanceManager,
"MyRNAppExample",
initialProperties);
setContentView(mReactRootView);

}

最新更新