日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 EventChannel 通信 )

發(fā)布時(shí)間:2025/6/17 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 EventChannel 通信 ) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 前言
  • 一、Android 端 EventChannel 構(gòu)造函數(shù)
  • 二、Android 端 setStreamHandler 方法
  • 三、Android 端實(shí)現(xiàn) EventChannel 通信步驟
  • 四、 Android 端與 Flutter 端 EventChannel 注冊與監(jiān)聽流程
  • 五、相關(guān)資源

前言

本博客與 【Flutter】Flutter 混合開發(fā) ( Flutter 與 Native 通信 | 在 Flutter 端實(shí)現(xiàn) EventChannel 通信 ) 博客相對應(yīng) , 該博客中開發(fā) Flutter 的 Dart 端 ;

本博客中開發(fā) Android 中的 Java 端 , 最終目標(biāo)是二者可以進(jìn)行信息交流 ;





一、Android 端 EventChannel 構(gòu)造函數(shù)



Android 端 Java 中 , EventChannel 構(gòu)造函數(shù)方法原型如下 :

public final class EventChannel {private static final String TAG = "EventChannel#";private final BinaryMessenger messenger;private final String name;private final MethodCodec codec;/*** Creates a new channel associated with the specified {@link BinaryMessenger} and with the* specified name and the standard {@link MethodCodec}.** @param messenger a {@link BinaryMessenger}.* @param name a channel name String.*/public EventChannel(BinaryMessenger messenger, String name) {this(messenger, name, StandardMethodCodec.INSTANCE);}/*** Creates a new channel associated with the specified {@link BinaryMessenger} and with the* specified name and {@link MethodCodec}.** @param messenger a {@link BinaryMessenger}.* @param name a channel name String.* @param codec a {@link MessageCodec}.*/public EventChannel(BinaryMessenger messenger, String name, MethodCodec codec) {if (BuildConfig.DEBUG) {if (messenger == null) {Log.e(TAG, "Parameter messenger must not be null.");}if (name == null) {Log.e(TAG, "Parameter name must not be null.");}if (codec == null) {Log.e(TAG, "Parameter codec must not be null.");}}this.messenger = messenger;this.name = name;this.codec = codec;} }

BasicMessageChannel 接收 333 個(gè)參數(shù) :

  • BinaryMessenger messenger : 用于 發(fā)送 / 接收消息 ;
  • String name : Channel 消息通道的名稱 , 該名稱必須與 Dart 中的消息通道名稱相同 ;
  • MethodCodec codec : 方法編解碼器 ;

如果使用 EventChannel(BinaryMessenger messenger, String name) 構(gòu)造函數(shù) , 不傳入 MethodCodec , 那么會傳入 標(biāo)準(zhǔn)的方法編解碼器 StandardMethodCodec ;





二、Android 端 setStreamHandler 方法



創(chuàng)建了 EventChannel 實(shí)例對象后 , 如果要接收 Dart 端發(fā)送來的消息 , 需要設(shè)置 消息處理器 ;

調(diào)用 setStreamHandler 方法 , 可以為 EventChannel 設(shè)置一個(gè) 消息處理器 ;


EventChannel.setStreamHandler 函數(shù)原型如下 :

/*** Registers a stream handler on this channel.** <p>Overrides any existing handler registration for (the name of) this channel.** <p>If no handler has been registered, any incoming stream setup requests will be handled* silently by providing an empty stream.** @param handler a {@link StreamHandler}, or null to deregister.*/@UiThreadpublic void setStreamHandler(final StreamHandler handler) {messenger.setMessageHandler(name, handler == null ? null : new IncomingStreamRequestHandler(handler));}

設(shè)置的 final @Nullable StreamHandler handler 參數(shù) , 就是 消息處理器 ;

在 StreamHandler 接口中 , 定義了兩個(gè)接口方法 : onListen 和 onCancel 方法 ;

void onListen(Object arguments, EventSink events) : 用于接收 Dart 端所發(fā)送的消息 ;

  • Object arguments 參數(shù) : Dart 端發(fā)送的數(shù)據(jù) ;
  • EventSink events 參數(shù) : Android 中收到了 Dart 端數(shù)據(jù) , 要回調(diào) Dart 時(shí)回調(diào)的函數(shù) ;

StreamHandler 接口原型如下 :

/*** Handler of stream setup and teardown requests.** <p>Implementations must be prepared to accept sequences of alternating calls to {@link* #onListen(Object, EventSink)} and {@link #onCancel(Object)}. Implementations should ideally* consume no resources when the last such call is not {@code onListen}. In typical situations,* this means that the implementation should register itself with platform-specific event sources* {@code onListen} and deregister again {@code onCancel}.*/public interface StreamHandler {/*** Handles a request to set up an event stream.** <p>Any uncaught exception thrown by this method will be caught by the channel implementation* and logged. An error result message will be sent back to Flutter.** @param arguments stream configuration arguments, possibly null.* @param events an {@link EventSink} for emitting events to the Flutter receiver.*/void onListen(Object arguments, EventSink events);/*** Handles a request to tear down the most recently created event stream.** <p>Any uncaught exception thrown by this method will be caught by the channel implementation* and logged. An error result message will be sent back to Flutter.** <p>The channel implementation may call this method with null arguments to separate a pair of* two consecutive set up requests. Such request pairs may occur during Flutter hot restart. Any* uncaught exception thrown in this situation will be logged without notifying Flutter.** @param arguments stream configuration arguments, possibly null.*/void onCancel(Object arguments);}

EventSink 接口中 , 有 333 個(gè)方法 :

  • success : 表示接收數(shù)據(jù)成功 ;
  • error : 表示接收數(shù)據(jù)出現(xiàn)錯(cuò)誤 ;
  • endOfStream : 表示接收數(shù)據(jù)結(jié)束 ;
/*** Event callback. Supports dual use: Producers of events to be sent to Flutter act as clients of* this interface for sending events. Consumers of events sent from Flutter implement this* interface for handling received events (the latter facility has not been implemented yet).*/public interface EventSink {/*** Consumes a successful event.** @param event the event, possibly null.*/void success(Object event);/*** Consumes an error event.** @param errorCode an error code String.* @param errorMessage a human-readable error message String, possibly null.* @param errorDetails error details, possibly null*/void error(String errorCode, String errorMessage, Object errorDetails);/*** Consumes end of stream. Ensuing calls to {@link #success(Object)} or {@link #error(String,* String, Object)}, if any, are ignored.*/void endOfStream();}



三、Android 端實(shí)現(xiàn) EventChannel 通信步驟



Android 端實(shí)現(xiàn) EventChannel 通信步驟 :

首先 , 初始化 EventChannel 實(shí)例對象 ;

// 初始化 EventChannel 實(shí)例對象 EventChannel mEventChannel = new EventChannel(mFlutterFragment.getFlutterEngine().getDartExecutor(),"EventChannel");

然后 , 為 EventChannel 實(shí)例對象設(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;} });

最后 , 調(diào)用 EventChannel.EventSink 的 success 方法 , 向 Flutter 端發(fā)送數(shù)據(jù) ;

findViewById(R.id.channel2).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.i(TAG, "Native 通過 EventChannel 通道發(fā)送消息 , mEventSink : " + mEventSink);// 點(diǎn)擊按鈕 , 向 Flutter 端發(fā)送數(shù)據(jù)if (mEventSink != null) {mEventSink.success("Native 通過 EventChannel 通道發(fā)送消息 Hello !");}} });

注意 : 這里要特別注意 , Android 與 Flutter 中 EventChannel 的初始化流程 , 先初始化 Android 中的 EventChannel , 再初始化 Flutter 中的 EventChannel , 如果順序不對 , 無法進(jìn)行通信 ;

【錯(cuò)誤記錄】Flutter 混合開發(fā)報(bào)錯(cuò) ( Android 端與 Flutter 端 EventChannel 初始化順序錯(cuò)誤導(dǎo)致無法通信 | EventChannel 通信流程 )





四、 Android 端與 Flutter 端 EventChannel 注冊與監(jiān)聽流程



Android 端與 Flutter 端 EventChannel 注冊與監(jiān)聽流程 :

① Android 端 初始化 EventChannel ;

// 初始化 EventChannel 實(shí)例對象 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 出錯(cuò)");print(error);} );

④ Android 端的 EventChannel.StreamHandler 接口的 onListen 回調(diào) , 此時(shí)可以在 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ù) ;

// 點(diǎn)擊按鈕 , 向 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)聽失敗 ;





五、相關(guān)資源



參考資料 :

  • Flutter 官網(wǎng) : https://flutter.dev/
  • Flutter 插件下載地址 : https://pub.dev/packages
  • Flutter 開發(fā)文檔 : https://flutter.cn/docs ( 強(qiáng)烈推薦 )
  • 官方 GitHub 地址 : https://github.com/flutter
  • Flutter 中文社區(qū) : https://flutter.cn/
  • Flutter 實(shí)用教程 : https://flutter.cn/docs/cookbook
  • Flutter CodeLab : https://codelabs.flutter-io.cn/
  • Dart 中文文檔 : https://dart.cn/
  • Dart 開發(fā)者官網(wǎng) : https://api.dart.dev/
  • Flutter 中文網(wǎng) : https://flutterchina.club/ , http://flutter.axuer.com/docs/
  • Flutter 相關(guān)問題 : https://flutterchina.club/faq/ ( 入門階段推薦看一遍 )
  • GitHub 上的 Flutter 開源示例 : https://download.csdn.net/download/han1202012/15989510
  • Flutter 實(shí)戰(zhàn)電子書 : https://book.flutterchina.club/chapter1/
  • Dart 語言練習(xí)網(wǎng)站 : https://dartpad.dartlang.org/

重要的專題 :

  • Flutter 動(dòng)畫參考文檔 : https://flutterchina.club/animations/

博客源碼下載 :

  • GitHub 地址 : ( 隨博客進(jìn)度一直更新 , 有可能沒有本博客的源碼 )

    • Flutter Module 工程 : https://github.com/han1202012/flutter_module
    • Android 應(yīng)用 : https://github.com/han1202012/flutter_native
    • 注意 : 上面兩個(gè)工程要放在同一個(gè)目錄中 , 否則編譯不通過 ;
  • 博客源碼快照 : https://download.csdn.net/download/han1202012/21670919 ( 本篇博客的源碼快照 , 可以找到本博客的源碼 )

總結(jié)

以上是生活随笔為你收集整理的【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 EventChannel 通信 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。