【错误记录】Flutter 混合开发报错 ( Android 端与 Flutter 端 EventChannel 初始化顺序错误导致无法通信 | EventChannel 通信流程 )
文章目錄
- 一、 報錯信息
- 二、 Android 端與 Flutter 端 EventChannel 注冊與監(jiān)聽流程
- 三、 解決方案
一、 報錯信息
在 Android 端初始化 EventChannel ,
// 初始化 EventChannel 實例對象 EventChannel mEventChannel = new EventChannel(mFlutterFragment.getFlutterEngine().getDartExecutor(),"EventChannel");然后設(shè)置 EventChannel.StreamHandler ;
mEventChannel.setStreamHandler(new EventChannel.StreamHandler() {/*** 事件流建立成功會回調(diào)該方法* @param arguments* @param events*/@Overridepublic void onListen(Object arguments, EventChannel.EventSink events) {mEventSink = events;Log.i(TAG, "事件流建立成功");}@Overridepublic void onCancel(Object arguments) {mEventSink = null;} });出現(xiàn) onListen , 死活不回調(diào) , 說明事件流 , 始終沒有創(chuàng)建成功 ;
檢查了下 Flutter 端的 代碼 , 沒有發(fā)現(xiàn)問題 ;
// 注冊 EventChannel 監(jiān)聽 _streamSubscription = _eventChannel.receiveBroadcastStream() /// StreamSubscription<T> listen(void onData(T event)?, /// {Function? onError, void onDone()?, bool? cancelOnError});.listen(/// EventChannel 接收到 Native 信息后 , 回調(diào)的方法(message) {print("Flutter _eventChannel listen 回調(diào)");setState(() {/// 接收到消息 , 顯示在界面中showMessage = message;});},onError: (error){print("Flutter _eventChannel listen 出錯");print(error);} );二、 Android 端與 Flutter 端 EventChannel 注冊與監(jiān)聽流程
Android 端與 Flutter 端 EventChannel 注冊與監(jiān)聽流程 :
① Android 端 初始化 EventChannel ;
// 初始化 EventChannel 實例對象 mEventChannel = new EventChannel(mFlutterFragment.getFlutterEngine().getDartExecutor(),"EventChannel");② Android 端為 EventChannel 設(shè)置 EventChannel.StreamHandler ;
mEventChannel.setStreamHandler(new EventChannel.StreamHandler() {/*** 事件流建立成功會回調(diào)該方法* @param arguments* @param events*/@Overridepublic void onListen(Object arguments, EventChannel.EventSink events) {mEventSink = events;Log.i(TAG, "事件流建立成功");}@Overridepublic void onCancel(Object arguments) {mEventSink = null;} });③ Flutter 端注冊監(jiān)聽 ;
// 注冊 EventChannel 監(jiān)聽 _streamSubscription = _eventChannel.receiveBroadcastStream() /// StreamSubscription<T> listen(void onData(T event)?, /// {Function? onError, void onDone()?, bool? cancelOnError});.listen(/// EventChannel 接收到 Native 信息后 , 回調(diào)的方法(message) {print("Flutter _eventChannel listen 回調(diào)");setState(() {/// 接收到消息 , 顯示在界面中showMessage = message;});},onError: (error){print("Flutter _eventChannel listen 出錯");print(error);} );④ Android 端的 EventChannel.StreamHandler 接口的 onListen 回調(diào) , 此時可以在 Android 端持有 EventChannel.EventSink events , 可以借助該對象向 Flutter 發(fā)送數(shù)據(jù) ;
/*** 事件流建立成功會回調(diào)該方法* @param arguments* @param events*/ @Override public void onListen(Object arguments, EventChannel.EventSink events) {mEventSink = events;Log.i(TAG, "事件流建立成功"); }⑥ Android 端調(diào)用 EventChannel.EventSink 發(fā)送數(shù)據(jù) ;
// 點擊按鈕 , 向 Flutter 端發(fā)送數(shù)據(jù) if (mEventSink != null) {mEventSink.success("Native 通過 EventChannel 通道發(fā)送消息 Hello !"); }⑦ Flutter 端接收到 Android 端發(fā)送的數(shù)據(jù) ; 回調(diào) listen 方法的如下匿名方法參數(shù) ;
(message) {print("Flutter _eventChannel listen 回調(diào)");setState(() {/// 接收到消息 , 顯示在界面中showMessage = message;});上述流程 , 必須按照順序執(zhí)行 , 否則注冊監(jiān)聽失敗 ;
三、 解決方案
在執(zhí)行時 , 先執(zhí)行了 Flutter 的注冊監(jiān)聽操作 , 然后才執(zhí)行 Android 中的初始化 EventChannel 對象 , 并設(shè)置 EventChannel.StreamHandler() ;
Android 端與 Flutter 端 EventChannel 初始化順序錯誤 , 導致 Android 端的 EventChannel.StreamHandler 接口的 onListen 方法 , 始終無法進行回調(diào) ;
這里將 Flutter 端的初始化操作 , 延遲幾秒 , 先讓 Android 端的 EventChannel 進行初始化 , 然后在 Flutter 端注冊 EventChannel 監(jiān)聽 ;
/// 這里延遲 6 秒在注冊該事件/// 一定要先在 Android 中設(shè)置好 EventChannel/// 然后 , 才能在 Flutter 中設(shè)置監(jiān)聽/// 否則 , 無法成功Future.delayed(const Duration(milliseconds: 6000), () {// Here you can write your code// 注冊 EventChannel 監(jiān)聽_streamSubscription = _eventChannel.receiveBroadcastStream()/// StreamSubscription<T> listen(void onData(T event)?,/// {Function? onError, void onDone()?, bool? cancelOnError});.listen(/// EventChannel 接收到 Native 信息后 , 回調(diào)的方法(message) {print("Flutter _eventChannel listen 回調(diào)");setState(() {/// 接收到消息 , 顯示在界面中showMessage = message;});},onError: (error){print("Flutter _eventChannel listen 出錯");print(error);});setState(() {});});Flutter 端成功接收到了 Android 端通過 EventChannel 向其發(fā)送的消息 ;
總結(jié)
以上是生活随笔為你收集整理的【错误记录】Flutter 混合开发报错 ( Android 端与 Flutter 端 EventChannel 初始化顺序错误导致无法通信 | EventChannel 通信流程 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Flutter】Flutter 混合开
- 下一篇: 【Flutter】Flutter 混合开