You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android现有项目集成RN:Activity间POJO传入RN JS代码实现方法

我刚好在项目里做过类似的React Native嵌入现有Android应用的需求,给你分享几个实用的方法,把POJO数据传到JS代码里:

方法一:初始化ReactRootView时传递初始属性

这是最直接的方式,适合在RN组件初始化时就需要用到POJO数据的场景。核心是把POJO转成RN能识别的键值对结构,在创建ReactRootView时传入。

Android端代码(Activity B中)

// 1. 先把你的POJO对象转成RN支持的HashMap
HashMap<String, Object> pojoParams = new HashMap<>();
pojoParams.put("id", yourPojo.getId());
pojoParams.put("userName", yourPojo.getUserName());
pojoParams.put("isActive", yourPojo.isActive());
// 嵌套字段可以继续转成HashMap嵌套进去

// 2. 创建ReactRootView并设置初始属性
ReactRootView rootView = new ReactRootView(this);
rootView.setInitialProperties(pojoParams);

// 3. 初始化ReactInstanceManager并关联rootView
ReactInstanceManager reactInstanceManager = ReactInstanceManager.builder()
        .setApplication(getApplication())
        .setCurrentActivity(this)
        .setBundleAssetName("index.android.bundle")
        .setJSMainModulePath("index")
        .addPackage(new MainReactPackage())
        .build();

// 4. 启动RN应用,把参数传进去
rootView.startReactApplication(reactInstanceManager, "YourRNComponent", pojoParams);

// 最后把rootView添加到Activity B的布局容器中
LinearLayout container = findViewById(R.id.rn_container);
container.addView(rootView);

React Native端代码

const YourRNComponent = (props) => {
  // 直接通过props拿到传递过来的POJO数据
  console.log('Received POJO:', props);
  
  return (
    <View style={{padding: 16}}>
      <Text>用户ID: {props.id}</Text>
      <Text>用户名: {props.userName}</Text>
      <Text>状态: {props.isActive ? '活跃' : '禁用'}</Text>
    </View>
  );
};

export default YourRNComponent;
方法二:通过ReactContext发送自定义事件

如果POJO数据是在RN初始化完成后才需要传递,或者后续有更新需求,可以用这种方式主动给JS发送事件。

Android端代码(Activity B中)

// 给ReactInstanceManager添加初始化监听
reactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
    @Override
    public void onReactContextInitialized(ReactContext reactContext) {
        // 把POJO转成RN的WritableMap
        WritableMap params = Arguments.createMap();
        params.putInt("id", yourPojo.getId());
        params.putString("userName", yourPojo.getUserName());
        
        // 发送自定义事件到JS
        reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("onPojoDataReceived", params);
    }
});

React Native端代码

import { NativeEventEmitter, NativeModules, View, Text, useState, useEffect } from 'react-native';

const eventEmitter = new NativeEventEmitter(NativeModules.DeviceEventManagerModule);

const YourRNComponent = () => {
  const [pojoData, setPojoData] = useState(null);

  useEffect(() => {
    // 监听原生发送的事件
    const subscription = eventEmitter.addListener(
      'onPojoDataReceived',
      (data) => {
        setPojoData(data);
        console.log('Received via event:', data);
      }
    );

    // 组件卸载时移除监听
    return () => subscription.remove();
  }, []);

  if (!pojoData) return null;

  return (
    <View style={{padding: 16}}>
      <Text>用户名: {pojoData.userName}</Text>
    </View>
  );
};

export default YourRNComponent;
方法三:自定义原生模块(JS主动获取数据)

如果需要JS主动触发获取POJO数据的操作,可以写一个自定义原生模块,提供给JS调用的方法。

Android端:创建自定义模块

public class PojoDataModule extends ReactContextBaseJavaModule {
    private final YourPOJO yourPojo;

    public PojoDataModule(ReactApplicationContext reactContext, YourPOJO pojo) {
        super(reactContext);
        this.yourPojo = pojo;
    }

    // 模块名称,JS中通过这个名称调用
    @Override
    public String getName() {
        return "PojoDataModule";
    }

    // 暴露给JS的异步方法,用Promise返回数据
    @ReactMethod
    public void getPojoData(Promise promise) {
        WritableMap dataMap = Arguments.createMap();
        dataMap.putInt("id", yourPojo.getId());
        dataMap.putString("userName", yourPojo.getUserName());
        promise.resolve(dataMap);
    }
}

Android端:注册自定义模块

public class CustomReactPackage implements ReactPackage {
    private final YourPOJO pojo;

    public CustomReactPackage(YourPOJO pojo) {
        this.pojo = pojo;
    }

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new PojoDataModule(reactContext, pojo));
        return modules;
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

Android端:在Activity B中添加自定义Package

ReactInstanceManager reactInstanceManager = ReactInstanceManager.builder()
        // ...其他配置
        .addPackage(new MainReactPackage())
        .addPackage(new CustomReactPackage(yourPojo)) // 加入自定义Package
        .build();

React Native端代码

import { NativeModules, View, Text, useState, useEffect } from 'react-native';

const { PojoDataModule } = NativeModules;

const YourRNComponent = () => {
  const [pojoData, setPojoData] = useState(null);

  useEffect(() => {
    // 主动调用原生方法获取数据
    const fetchData = async () => {
      try {
        const data = await PojoDataModule.getPojoData();
        setPojoData(data);
      } catch (error) {
        console.error('Failed to fetch POJO:', error);
      }
    };

    fetchData();
  }, []);

  if (!pojoData) return <Text>Loading...</Text>;

  return (
    <View style={{padding: 16}}>
      <Text>用户ID: {pojoData.id}</Text>
    </View>
  );
};

export default YourRNComponent;

注意:不管用哪种方法,都不能直接传递POJO对象,必须先转换成RN支持的可序列化类型(如HashMap或WritableMap),字段类型要对应JS的基础类型(字符串、数字、布尔值等),嵌套对象需要逐层转换。

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:57:29