在react native中会涉及到不少页面之间的参数传递问题。静态的参数传递一般利用组件的Props属性,在初始化组件时便可从父组件中将参数传递到子组件中。对于非父子关系的组件来讲,没法直接传递参数,此时可能会用到react-navigation来传递;此外,若要将异步函数、不可预料的事件执行等获得的参数用于页面刷新时,前述的方法都不太奏效。react
react-native中采用了DeviceEventEmitter来实现对事件的监听,实现非父子关系的页面之间的通讯。具体来讲,咱们能够在一个页面中经过DeviceEventEmitter来对特定名称的事件进行监听,此后每当其它位置发送该名称的事件,都会触发这个监听的响应并执行对应的函数。android
DeviceEventEmitter优势在于一次注册屡次响应,而且注册后的监听事件是全局性的。不只如此,经过DeviceEventEmitter还能够与原生模块进行交互。react-native
首先要引入DeviceEventEmitter,DeviceEventEmitter在原生库中,直接引入便可:异步
import { DeviceEventEmitter } from 'react-native';
一般来讲咱们会在组件加载完成后开始监听事件:ide
componentDidMount(){ this.emitter = DeviceEventEmitter.addListener('eventName’, function); };
addListener('eventName’, function);
拥有两个参数,第一个参数是监听事件的名称,为字符串类型;第二个参数是触发监听事件后的回调函数。函数
注册监听后,咱们能够在任意位置直接使用DeviceEventEmitter.emit('eventName',params)
来广播一个事件。该函数也有两个参数。第一个参数一样为事件名称;第二个参数为可选项,用于参数的传递。this
当页面卸载时,卸载监听事件:code
componentWillUnmount() { this.emitter.remove() }
只须要在原生模块中广播该事件便可。具体代码以下:component
private void sendEvent(ReactContext reactContext,String eventName, @Nullable WritableMap params) { reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit(eventName, params); }
上述代码发送了一个名为eventName的包含params参数的事件,值得注意的是发送该事件的前提是react native环境已经加载完成,须要获取其上下文ReactContext。事件
react native没法直接监听广播事件,所以须要用到原生模块协助。此处经过两次监听事件,采用安卓原生广播+安卓与react native通讯来实现react native对通知消息点击事件的响应。
第一步采用经过安卓原生模块监听通知点击事件(参见安卓广播机制)并获取到通知携带的参数信息。
public static class NotificationReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals("androidNotification")){//响应通知事件 String params = intent.getExtras().getString("params"); if(params != null){ sendEventToRn("RNnotification",params);//发送事件给RN } } } } public static void sendEventToRn(String eventName, @Nullable String params){ //这里的模块中context已经获取 context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit("notification", params); }
'RNnotification','androidNotification'为静态注册的广播接收器。广播的发送须要在通知消息的设置处自定义。本项目中处理过程以下:
Intent intent =new Intent(); intent.setAction("androidNotification"); intent.putExtra("params",msg.getRaw().toString()); Activity currentActivity = MainActivity.getCurrentActivity();//这里获取的是当前activity currentActivity.sendBroadcast(intent);
而后在react native中监听通知事件'RNnotification'
DeviceEventEmitter.addListener('notification',this.notification); console.log('开始监听通知'); notification = (paramString) =>{ //...此处实现了根据参数导航到指定页面 }
大功告成。