<强> Android原生原反应生模块与JS模块通信的方法总结强>
<强>前言:强>
在做反应本地开发的时候避免不了的需要原生模块和JS之间进行数据传递,这篇文章将向大家分享原生模块向JS传递数据的几种方式。
<强>方式一:通过回调的方式强>
说起回调大家都不陌生,它是最常用的设计模式之一。无论是Java object - C, C #,还是JavaScript等都会看到回调的身影。
原生模块支持回调函数类型的参数,该回调对应JS中的功能。
在原生模块中:
公开课RNTestModule延伸ReactContextBaseJavaModule { 公共RNTestModule (ReactApplicationContext reactContext) { 超级(reactContext); } @Override 公共字符串getName () { 返回“RNTest”; } @ReactMethod 公共空间measureLayout ( int标签, int ancestorTag, 回调errorCallback, 回调successCallback) { 尝试{ measureLayout(标签,ancestorTag mMeasureBuffer); map.putDouble (" relativeX ", 1); 地图。putDouble (" relativeY ", 1); 地图。putDouble(“宽度”,2); map.putDouble(“高度”,3); successCallback。调用(relativeX relativeY、宽度、高度); }捕捉(IllegalViewOperationException e) { errorCallback.invoke (e.getMessage ()); } } >之前在上述代码中,measureLayout方法的参数中后两个就是回调函数,当原生模块处理成功时通过successCallback回调来告知JS处理成功的结果,当原生模块发生异常时,则通过errorCallback回调来JS处理异常。
<强>在JS模块中:强>
RNTest.measureLayout ( One hundred. One hundred. (味精)=比;{ console.log(味精); }, (x, y,宽度、高度)=比;{ 控制台。日志(x +‘:’+ y +‘:’+宽度+‘:’+高度); } ); >之前上述代码,是在JS模块中调用原生模块的方法measureLayout,同时向它传递了四个参数,后两个是功能类型的参数用于接收原生模块的处理结果。
通过上述的方式,JS调用原生模块的measureLayout方法,原生模块则通过errorCallback与successCallbackCallbacks来将处理结果传递到JS。
这种“你打电话给我,我将回调”的方式小伙伴们都看懂了吧。
<强>方式二:通过承诺的方式强>
承诺是ES6的一个新的特性,在本机中反应你会看到承诺的大量使用。
原生模块也是支持承诺的,这对喜欢使用承诺的小伙伴则是一个很好的消息。
在原生模块中:
公开课RNTestModule延伸ReactContextBaseJavaModule { 公共RNTestModule (ReactApplicationContext reactContext) { 超级(reactContext); } @Override 公共字符串getName () { 返回“RNTest”; } @ReactMethod 公共空间measureLayout ( int标签, int ancestorTag, 承诺承诺){ 尝试{ WritableMap地图=Arguments.createMap (); map.putDouble (" relativeX ", 1); 地图。putDouble (" relativeY ", 1); 地图。putDouble(“宽度”,2); map.putDouble(“高度”,3); promise.resolve(地图); }捕捉(IllegalViewOperationException e) { promise.reject (e); } } } >之前上述代码中,measureLayout方法接收的最后一个为承诺,当相应的处理结果出来之后原生模块通过调用承诺的相应方法来向JS模块传递处理成功,或处理失败的数据。
提示:在原生模块中承诺类型的参数要放在最后一位,这样JS调用的时候才能返回一个承诺。
<强>在JS模块中:强>
异步测试(){ 尝试{ var { relativeX, relativeY, 宽度, 高度, }=等待RNTest。measureLayout (100、100); 控制台。日志(relativeX +‘:’+ relativeY +‘:’+宽度+‘:’+高度); }捕捉(e) { console.error (e); } } >之前在上述代码中,通过ES7的新特性异步/等待来修饰了测试方法,来以同步方式调用原生模块的measureLayout方法,如果原生模块处理成功,
那么JS中relativeX, relativeY,宽度,高度会获得相应的值,如果原生模块处理失败,则会抛出异常。
如果,不希望以同步的形式调用,可以这样写:
Android原生原反应生模块与JS模块通信的方法总结