文章目錄
- (一)通過MessageChannel實現Flutter與原生平臺之間的雙向通信
- Flutter端實現MessageChannel通信步驟:
- Android端實現MessageChannel通信步驟:
- (二)通過MethodChannel實現Flutter與原生平臺之間的雙向通信
- Flutter端實現MessageChannel通信步驟:
- Android端實現MessageChannel通信步驟:
- (三)通過EventChannel實現Flutter與原生平臺之間的雙向通信
- Flutter端實現EventChannel通信步驟:
- Android端實現EventChannel通信步驟:
首先,現在Android中進行注冊與初始化:
private void registerChannelFunction() {FlutterEngine flutterEngine = getFlutterEngine();if (flutterEngine == null) {Log.e("ERROR", "注冊消息通道失敗 FlutterEngine = null");return;}DartExecutor dartExecutor = flutterEngine.getDartExecutor();binaryMessenger = dartExecutor.getBinaryMessenger();messageChannelSendFunction();methodChannelSendFunction();eventChannelSendFunction();}
(一)通過MessageChannel實現Flutter與原生平臺之間的雙向通信
Flutter端實現MessageChannel通信步驟:
先定義messageChannel
static const basicMethodChannel =
BasicMessageChannel("flutter_basic_method_channel", StandardMessageCodec());
發送message:
Future<void> sendMessage(Map json) async {await basicMethodChannel.send(json);}
接收message:
void receiveMessage() {basicMethodChannel.setMessageHandler((result) async {Map? map = result as Map?;int code = map?["code"];String message=map?["message"];setState(() {receive = "messageChannel receiveMessage 中的回調 code $code message $message";print(receive);print("receiveMessage: code:$code message:$message");});return 'Flutter 已收到消息';});}
Android端實現MessageChannel通信步驟:
首先,先初始化 BasicMessageChannel 實例對象:
basicMessageChannel = new BasicMessageChannel<>(binaryMessenger,
"flutter_basic_method_channel", StandardMessageCodec.INSTANCE);
然后為Message對象設置MessageHandler對象:
basicMessageChannel.setMessageHandler(new BasicMessageChannel.MessageHandler() {@Overridepublic void onMessage(@Nullable Object message, @NonNull BasicMessageChannel.Reply reply) {System.out.println("flutter 傳來的數據為: "+message.toString());basicSendMessage();}});
(二)通過MethodChannel實現Flutter與原生平臺之間的雙向通信
Flutter端實現MessageChannel通信步驟:
定義methodChannel:
static const methodChannel = MethodChannel("flutter_method_channel");
然后通過methodChannel的invokeMethod進行消息的發送:
static Future<dynamic> invokeNative(String method,{required Map<String, String> arguments}) async {if (arguments == null) {return await methodChannel.invokeMethod(method);} else {return await methodChannel.invokeMethod(method, arguments);}}
最后調用會返回一個結果,通過這個result拿到返回的數據:
Map result = await invokeNative("test", arguments: {});int code = result["code"];String message = result["message"];setState(() {receive = "invokeNative 中的回調 code $code message $message";print(receive);});
Android端實現MessageChannel通信步驟:
先初始化MethodChannel的實例:
mMethodChannel = new MethodChannel(binaryMessenger, channelName);
然后設置methodHandler,它會重寫MethodCallHandler的onMethodCall方法:
private MethodChannel.MethodCallHandler getMethodCallHandler() {return new MethodChannel.MethodCallHandler() {@Overridepublic void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {String method = call.method;Object Arguments = call.arguments;Map<String, Object> arguments = null;if (null != Arguments) {arguments = (Map<String, Object>) Arguments;}if ("test".equals(method)) {Toast.makeText(this, "flutter 調用到了 android test 數據為 name :"+arguments.get("name") +" age : "+arguments.get("age"), Toast.LENGTH_SHORT).show();Map<String, Object> objectMap = new HashMap<>();objectMap.put("message", "result.success 返回給flutter的basic數據");objectMap.put("code", 300);result.success(objectMap);} else {result.notImplemented();}}};}
(三)通過EventChannel實現Flutter與原生平臺之間的雙向通信
Flutter端實現EventChannel通信步驟:
首先 初始化EventChannel實例:
static const eventChannel = EventChannel("flutter_event_channel");
然后設置Stream:
eventChannel.receiveBroadcastStream().listen((event) {// int code = event["code"];// String message = event["message"];setState(() {// receive += "code $code message $message ";// print("eventMessageListener: "+receive);print(event);});}, onError: (event) {});
Android端實現EventChannel通信步驟:
初始化EventChannel:
String channelName = "flutter_event_channel";
EventChannel eventChannel = new EventChannel(binaryMessenger, channelName);
然后調用setStreamHandler為EventChannel設置一個處理器:
eventChannel.setStreamHandler(new EventChannel.StreamHandler() {@Overridepublic void onListen(Object arguments, EventChannel.EventSink events) {eventSink = events;startTimer();}@Overridepublic void onCancel(Object arguments) {}});
EventSink 接口中 , 有 3 個方法 :
- success : 表示接收數據成功 ;
- error : 表示接收數據出現錯誤 ;
- endOfStream : 表示接收數據結束 ;
這樣就完成了Flutter與Android原生之間的通信,IOS的不太熟,有需要可以搜一下,都大差不差,如果覺得博主寫的對你有幫助,麻煩給個一鍵三連