[React-native]RN模块API学习-RN,原生交互

封装基础

官方文档

需要注意的点是:

1、组件的名称

@Override
public String getName() {
    return "ToastCustomAndroid";
}

后面在js中使用到的

import {NativeModules} from 'react-native';
module.exports = NativeModules.ToastCustomAndroid;

需要和上面name一致。

2、经过更改了android原生代码就不能再直接reloadjsBundle组件了,需要重新编译android的原生相关的代码。

异步处理

  • 回调方法
@ReactMethod
public void callBackFunction(boolean flag, Callback successCallback, Callback errorCallback) {
    if (flag) {
        successCallback.invoke(1, 2, 3, 4, 5);
    } else {
        errorCallback.invoke(6, 7, 8, 9, 10);
    }
}

当你希望以回调函数的形式来处理异步的时候,你需要使用Callback这个类的对象。

然后,在JS代码中这样处理:

ToastCustomAndroid.callBackFunction(
                  true,
                  (a,b,c,d,e)=>{
                      ToastCustomAndroid.show('pressed+++true'+rowID+";"+a+","+b+","+c+","+d+","+e,1);
                      },
                  (a,b,c,d,e)=>{
                      ToastCustomAndroid.show('pressed++++false'+rowID+";"+a+","+b+","+c+","+d+","+e,1);
                      }
)

需要注意的是:你必须给定同样数量的参数进行回调使用。

  • Promise对象

ES6中提供了Promise进行处理异步的回调

阮老师的ES6-Promise教程

@ReactMethod
public void promiseCallbackTest(boolean flag, Promise promise) {
    if (flag) {
        promise.resolve(100);
    } else {
        promise.reject("promise Error", "wrong");
    }
}

当使用@ReactMethod进行注解的方法供给RN模块使用的时候,我们传递给promiseCallbackTest的参数不需要最后的promise参数

ToastCustomAndroid.promiseCallbackTest(false).then(
                            (value)=>{
                                ToastCustomAndroid.show("promise返回值为"+value,1);
                            },
                            (message)=>{
                            ToastCustomAndroid.show("rejected"+message,1);
                            }
                        )

rejected的回调中,Java方法中传递了两个参数:

/**
 * Report an error which wasn't caused by an exception.
 */
void reject(String code, String message);

但是在JS的rejectedthen回调中,只能回调出message

从RN进行原生的Activity的跳转

其实知道了如何使用生产一个RN的module进行了:

@ReactMethod
    public void navigateToHybirdTestActivity(int data) {
        Intent intent = new Intent(getCurrentActivity(), HybirdTestActivity.class);
//        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("TEST_INTENT_DATA", data);
        getCurrentActivity().startActivity(intent);
    }

这里有个地方:

  • 你可以使用getReactApplicationContext()获取一个ContextWrapper对象进行startActivity,也可以获取getCurrentActivity()获取一个Activity对象进行startActivity

但是,如果使用getReactApplicationContext()调用startActivity则会提示:

getReactApplicationContext的error

当然,这样不具备通用性,可以使用反射:

@ReactMethod
public void startActivityFromJS(String name, String params){
        try{
            Activity currentActivity = getCurrentActivity();
            if(null!=currentActivity){
                Class toActivity = Class.forName(name);
                Intent intent = new Intent(currentActivity,toActivity);
                intent.putExtra("params", params);
                currentActivity.startActivity(intent);
            }
        }catch(Exception e){
            throw new JSApplicationIllegalArgumentException(
                    "不能打开Activity : "+e.getMessage());
        }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容