在把公司的项目集成RN的时候,遇到了许多问题,由于公司的项目全部都用了Fragment来显示页面。然而RN的ReactActivity是继承Activity的,无法在这个项目使用,只能把RN集成到Fragment上,由于一些数据要从原生里面拿到。但是调用原生数据callback,Promises ,事件方式:RCTDeviceEventEmitter 都是异步操作。不能满足某些需求
解决方法---ReactRootView缓存管理器
在继承ReactActivity的子类上只要重写createReactActivityDelegate方法就可以了
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new ReactActivityDelegate(this, getMainComponentName()) {
@Nullable
@Override
protected Bundle getLaunchOptions() {
return ;
}
};
}
在Fragment上改动也不大,使用
ReactRootView.startReactApplication(
ReactInstanceManager reactInstanceManager,
String moduleName,
@Nullable Bundle initialProperties)
*第一步
public static ReactNativeFragment newInstance(Bundle launchOptions) {
ReactNativeFragment fragment = new ReactNativeFragment();
Bundle args = new Bundle();
args.putBundle("bundle", launchOptions);
fragment.setArguments(args);
return fragment;
}
*第二步
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mBundle = getArguments().getBundle("bundle");
}
}
*第三步
mReactRootView.startReactApplication(getReactNativeHost().getReactInstanceManager(), "xxx", mBundle);
*第四步
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
delegate = new ReactActivityDelegate(getActivity(), "xxx") {
@javax.annotation.Nullable
@Override
protected Bundle getLaunchOptions() {
return mBundle;
}
};
}
然后再RN中界面就使用props获取就可以了
componentWillMount() {
alert(this.props.reactPage)
}
在补充一丢丢
Bundle bundle = new Bundle();
bundle.putString(reactPage,"111");
FragmentUtils.replace(this, ReactNativeFragment.newInstance(bundle));
最后!!!刚刚学习react native 真不容易,填完一个坑,又来一个坑。。。。。。。。。。