gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:30:53 25 4
gpt4 key购买 nike

我的 Android 应用程序是混合的,几个 Activity 是 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 派生特定的 Activity,这就是我所做的:

    public class ReactNative1Activity extends ReactActivity implements DefaultHardwareBackBtnHandler {

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

...
}

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

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

  /**
* 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();
}

使用委托(delegate)进行这些更改后,我开始遇到运行时错误

3:08:51.706 9817-9817/com.mytestapp.develop E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mytestapp.develop, PID: 9817 java.lang.RuntimeException: Unable to resume activity {com.mytestapp.develop/com.mytestapp.ReactNative1Activity}: java.lang.ClassCastException: com.mytestapp.MyApplication cannot be cast to 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(Unknown Source: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) Caused by: java.lang.ClassCastException: com.mytestapp.MyApplication cannot be cast to 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(Unknown Source: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 创建到自定义组件中。

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

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

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

ReactRootView.startApplication

接受,作为最后一个参数,他们称之为 initialProperties

这恰好与 ReactAcitityDelegate 的自定义(覆盖)getLaunchOption 返回的 Bundle 相同

因此,将带有您自己的自定义属性的 Bundle 传递到 ReactRootView.startReactApplication 中——有效。

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

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


}

关于android - 如何在混合 React-native 应用程序中传递初始属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52690918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com