原文地址:http://blog.csdn.net/jiaweihaoku/article/details/53259596
这是一遍关于Android与ReactNative混合开发的探讨文章。
我们项目出现了一个需求,就是点击原生的android按钮跳转到指定的reactNative界面,关于这方面,在网上我是没有找到任何资料,只有通过自己摸索,终于找到了一条走的通的路,如果有大神有更好的办法,可以留言教教我。互相学习进步。
我想到的办法就是点击Android原生按钮向rn传值,rn再通过这个值来跳转到指定的界面。
首先是android跳转rn并传值:
第一步写一个类继承ReactContextBaseJavaModule如下:
- public class IntentModule extends ReactContextBaseJavaModule {
-
- public IntentModule(ReactApplicationContext reactContext) {
- super(reactContext);
- }
-
- @Override
- public String getName() {
- return "IntentModule";
- }
-
- @ReactMethod
- public void dataToJS(Callback successBack, Callback errorBack){
- try{
- Activity currentActivity = getCurrentActivity();
- String result = currentActivity.getIntent().getStringExtra("data");
- if (TextUtils.isEmpty(result)){
- result = "没有数据";
- }
- successBack.invoke(result);
- }catch (Exception e){
- errorBack.invoke(e.getMessage());
- }
- }
- }
要注意的是getName方法必须重写
然后再写一个类将这个方法暴露出去,让rn可以调用:
- ublic class AnDataReactPackage implements ReactPackage{
- @Override
- public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
- List<NativeModule> modules = new ArrayList<>();
- modules.add(new IntentModule(reactContext));
- return modules;
- }
-
- @Override
- public List<Class<? extends JavaScriptModule>> createJSModules() {
- return Collections.emptyList();
- }
-
- @Override
- public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
- return Collections.emptyList();
- }
- }
最后在MainApplication中注册这个类:
- protected List<ReactPackage> getPackages() {
- return Arrays.<ReactPackage>asList(
- new MainReactPackage(),
- new AnDataReactPackage()
- );
- }
- };
之后就可以在rn中拿到activity跳转传递的值,值的传递跟普通activity之间的跳转没有差别:
- getData() {
- NativeModules.IntentModule.dataToJS((msg) => {
- console.log(msg);
- let base = require('./constant');
- base.columnID = msg;
-
- },
- (result) => {
- ToastAndroid.show('JS界面:错误信息为:' + result, ToastAndroid.SHORT);
- })
- }
从上面的代码中可以看到我拿到这个值之后存在了常量类里,就是通过这个常量来实现跳转到不同的界面,之后的事情就迎刃而解了:
- componentDidMount() {
- let base = require('./constant');
-
- let id = base.columnID;
- if (id == "3") {
- const { navigator } = this.props;
- if (navigator) {
- navigator.push({
- name: 'secondPage',
- component: secondPage,
- })
- }
- } if (id == "4") {
- const { navigator } = this.props;
- if (navigator) {
- navigator.push({
- name: 'otherPage',
- component: otherPage,
- })
- }
- }
- }