三、Android 端实现 EventChannel 通信步骤
Android 端实现 EventChannel 通信步骤 :
首先 , 初始化 EventChannel 实例对象 ;
// 初始化 EventChannel 实例对象 EventChannel mEventChannel = new EventChannel( mFlutterFragment.getFlutterEngine().getDartExecutor(), "EventChannel");
然后 , 为 EventChannel 实例对象设置 EventChannel.StreamHandler ;
mEventChannel.setStreamHandler(new EventChannel.StreamHandler() {
/** * 事件流建立成功会回调该方法 * @param arguments * @param events */ @Override public void onListen(Object arguments, EventChannel.EventSink events) { mEventSink = events; Log.i(TAG, "事件流建立成功"); } @Override public void onCancel(Object arguments) { mEventSink = null; } });
最后 , 调用 EventChannel.EventSink 的 success 方法 , 向 Flutter 端发送数据 ;
findViewById(R.id.channel2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "Native 通过 EventChannel 通道发送消息 , mEventSink : " + mEventSink); // 点击按钮 , 向 Flutter 端发送数据 if (mEventSink != null) { mEventSink.success("Native 通过 EventChannel 通道发送消息 Hello !"); } } });
注意 : 这里要特别注意 , Android 与 Flutter 中 EventChannel 的初始化流程 , 先初始化 Android 中的 EventChannel , 再初始化 Flutter 中的 EventChannel , 如果顺序不对 , 无法进行通信 ;
【错误记录】Flutter 混合开发报错 ( Android 端与 Flutter 端 EventChannel 初始化顺序错误导致无法通信 | EventChannel 通信流程 )
四、 Android 端与 Flutter 端 EventChannel 注册与监听流程
Android 端与 Flutter 端 EventChannel 注册与监听流程 :
① Android 端 初始化 EventChannel ;
// 初始化 EventChannel 实例对象 mEventChannel = new EventChannel( mFlutterFragment.getFlutterEngine().getDartExecutor(), "EventChannel");
② Android 端为 EventChannel 设置 EventChannel.StreamHandler ;
mEventChannel.setStreamHandler(new EventChannel.StreamHandler() {
/** * 事件流建立成功会回调该方法 * @param arguments * @param events */ @Override public void onListen(Object arguments, EventChannel.EventSink events) { mEventSink = events; Log.i(TAG, "事件流建立成功"); } @Override public void onCancel(Object arguments) { mEventSink = null; } });
③ Flutter 端注册监听 ;
// 注册 EventChannel 监听 _streamSubscription = _eventChannel .receiveBroadcastStream() /// StreamSubscription<T> listen(void onData(T event)?, /// {Function? onError, void onDone()?, bool? cancelOnError}); .listen( /// EventChannel 接收到 Native 信息后 , 回调的方法 (message) { print("Flutter _eventChannel listen 回调"); setState(() { /// 接收到消息 , 显示在界面中 showMessage = message; }); }, onError: (error){ print("Flutter _eventChannel listen 出错"); print(error); } );
④ Android 端的 EventChannel.StreamHandler 接口的 onListen 回调 , 此时可以在 Android 端持有 EventChannel.EventSink events , 可以借助该对象向 Flutter 发送数据 ;
/** * 事件流建立成功会回调该方法 * @param arguments * @param events */ @Override public void onListen(Object arguments, EventChannel.EventSink events) { mEventSink = events; Log.i(TAG, "事件流建立成功"); }
⑥ Android 端调用 EventChannel.EventSink 发送数据 ;
// 点击按钮 , 向 Flutter 端发送数据 if (mEventSink != null) { mEventSink.success("Native 通过 EventChannel 通道发送消息 Hello !"); }
⑦ Flutter 端接收到 Android 端发送的数据 ; 回调 listen 方法的如下匿名方法参数 ;
(message) { print("Flutter _eventChannel listen 回调"); setState(() { /// 接收到消息 , 显示在界面中 showMessage = message; });
上述流程 , 必须按照顺序执行 , 否则注册监听失败 ;