繁体   English   中英

将单个 React Native 视图添加到现有 Android 应用程序的正确方法是什么?

[英]What's the proper way to add a single React Native view to an existing Android application?

我正在处理现有的大型 Android 和 iOs 项目,我的团队想采用 React Native。 起初,我们想在 RN 中实现一个功能,因为我们没有能力一次性迁移整个项目。

我已经成功地从本地节点服务器和位于资产文件夹中的 JS 包文件添加了一个 RN 视图,但感觉有点老套。 我知道 iOs 支持此功能,但我在文档中找不到有关与现有 Android 项目集成的任何内容。 这是我想出的要点:

public class ReactNativeView extends FrameLayout {

    private static final String COMPONENT_NAME = "AwesomeProject";
    // Path of our RN module relative to project root
    private static final String MODULE_NAME = "react-sources/index.android"

    public ReactNativeView(Context Context) {
        super(context);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        ReactInstanceManager.Builder builder = ReactInstanceManager.builder()
                .setApplication(AppDelegate.sharedApplication())
                .addPackage(new MainReactPackage())
                .setUseDeveloperSupport(BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.BEFORE_RESUME);

        if (BuildConfig.USE_RN_LOCAL_SERVER) {
            // Set module name to be loaded from local node server
            builder.setJSMainModuleName(MODULE_NAME);
        } else {
            Uri uri = AssetsManager.getInstance().getJsBundleUri();
            // Load bundled jsBundle
            builder.setJSBundleFile(uri.getPath());
        }

        ReactInstanceManager reactInstanceManager = builder.build();
        MainActivity mainActivity = MainActivity.getMainActivity();

        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        ReactRootView reactRootView =
            new ReactRootView(AppDelegate.sharedApplication().getTopActivity());
        // Is it really necessary to call 'startReactApplication' each time we want to render a react component?
        reactRootView.startReactApplication(reactInstanceManager, COMPONENT_NAME, null);

        addView(reactRootView);
        // After the view is added to the hierarchy we call the manager's 'onResume' function
        // to show the react view
        reactInstanceManager.onResume(mainActivity, mainActivity); // <-- What kind of sorcery is this?!
    }
}

我还向 BuildConfig 添加了一个变量,用于确定要使用的 JS 包:

buildTypes {
    debug {
        buildConfigField "boolean", "USE_RN_LOCAL_SERVER", "true" // load from local server
    }
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField "boolean", "USE_RN_LOCAL_SERVER", "false"
    }
}

这是一个完整的破解。 当我实际上只是在屏幕上添加一个视图时调用startReactApplication感觉很尴尬。 我是否缺少 API 或者这是否不受支持?

你有没有检查过这个主题的RN官方文件

它向您展示了如何在Java编码的Android应用程序中干净地运行RN视图。

所以显然调用startReactApplication确实是要纠正的方法。 如果有人对更完整和有组织的解决方案感兴趣,您可以查看react-native-navigation

有一个关于如何做到这一点的官方 React Native 文档: https://reactnative.dev/docs/integration-with-existing-apps

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM