【错误记录】Flutter 混合开发报错 ( Android 端与 Flutter 端 EventChannel 初始化顺序错误导致无法通信 | EventChannel 通信流程 )
文章目錄
- 一、 報錯信息
- 二、 Android 端與 Flutter 端 EventChannel 注冊與監聽流程
- 三、 解決方案
一、 報錯信息
在 Android 端初始化 EventChannel ,
// 初始化 EventChannel 實例對象 EventChannel mEventChannel = new EventChannel(mFlutterFragment.getFlutterEngine().getDartExecutor(),"EventChannel");然后設置 EventChannel.StreamHandler ;
mEventChannel.setStreamHandler(new EventChannel.StreamHandler() {/*** 事件流建立成功會回調該方法* @param arguments* @param events*/@Overridepublic void onListen(Object arguments, EventChannel.EventSink events) {mEventSink = events;Log.i(TAG, "事件流建立成功");}@Overridepublic void onCancel(Object arguments) {mEventSink = null;} });出現 onListen , 死活不回調 , 說明事件流 , 始終沒有創建成功 ;
檢查了下 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 端與 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*/@Overridepublic void onListen(Object arguments, EventChannel.EventSink events) {mEventSink = events;Log.i(TAG, "事件流建立成功");}@Overridepublic 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;});上述流程 , 必須按照順序執行 , 否則注冊監聽失敗 ;
三、 解決方案
在執行時 , 先執行了 Flutter 的注冊監聽操作 , 然后才執行 Android 中的初始化 EventChannel 對象 , 并設置 EventChannel.StreamHandler() ;
Android 端與 Flutter 端 EventChannel 初始化順序錯誤 , 導致 Android 端的 EventChannel.StreamHandler 接口的 onListen 方法 , 始終無法進行回調 ;
這里將 Flutter 端的初始化操作 , 延遲幾秒 , 先讓 Android 端的 EventChannel 進行初始化 , 然后在 Flutter 端注冊 EventChannel 監聽 ;
/// 這里延遲 6 秒在注冊該事件/// 一定要先在 Android 中設置好 EventChannel/// 然后 , 才能在 Flutter 中設置監聽/// 否則 , 無法成功Future.delayed(const Duration(milliseconds: 6000), () {// Here you can write your code// 注冊 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);});setState(() {});});Flutter 端成功接收到了 Android 端通過 EventChannel 向其發送的消息 ;
總結
以上是生活随笔為你收集整理的【错误记录】Flutter 混合开发报错 ( Android 端与 Flutter 端 EventChannel 初始化顺序错误导致无法通信 | EventChannel 通信流程 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Flutter】Flutter 混合开
- 下一篇: 【Flutter】Flutter 混合开