赞
踩
Flutter 官方提供 MethodChannel、EventChannel、BasicMessageChannel 三种方式与原生通信
特点:单方请求响应(flutter->原生)
(1) flutter:
- static const platform = const MethodChannel('xiaochen.flutter.io/battery');
-
- try {
- final int result = await platform.invokeMethod('getBatteryLevel');
-
- } on PlatformException catch (e) {
-
- }
(2)原生:android
- private static final String battery= "xiaochen.flutter.io/battery";
-
-
- new MethodChannel(getFlutterView(), battery).setMethodCallHandler(
- new MethodCallHandler() {
- @Override
- public void onMethodCall(MethodCall call, Result result) {
- // TODO
- if (call.method.equals("getBatteryLevel")) {
- //java 核心代码
- int batteryLevel = getBatteryLevel();
- if (batteryLevel != -1) {
- result.success(batteryLevel);
- } else {
- result.error("UNAVAILABLE", "Battery level not available.", null);
- }
- } else {
- result.notImplemented();
- }
- }
- }
- );

(3)原生: IOS:
- FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;
-
- FlutterMethodChannel* batteryChannel = [FlutterMethodChannel
- methodChannelWithName:@"xiaochen.flutter.io/battery"
- binaryMessenger:controller];
-
-
-
- [batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
- // TODO
- if ([@"getBatteryLevel" isEqualToString:call.method]) {
-
- //IOS 核心代码
- int batteryLevel = [self getBatteryLevel];
-
- if (batteryLevel == -1) {
-
- result([FlutterError errorWithCode:@"UNAVAILABLE"
- message:@"Battery info unavailable"
- details:nil]);
- } else {
- result(@(batteryLevel));
- }
- } else {
- result(FlutterMethodNotImplemented);
- }
- }];

特点:接收数据(原生->flutter)
(1) flutter:
- static const EventChannel _eventChannel =
- const EventChannel('xiaochen.flutter.io/test');
-
- // 监听开始
- _eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);
-
-
- void _onEvent(Object event) {
- print('返回的内容: $event');
- }
-
- void _onError(Object error) {
- print('返回的错误');
- }
-
-
-

(2) 原生:android
- private static final String test= "xiaochen.flutter.io/test";
-
- private EventChannel.EventSink eventSink;
-
- new EventChannel(getFlutterView(), test).setStreamHandler(
- new EventChannel.StreamHandler() {
- @Override
- public void onListen(Object o, EventChannel.EventSink eventSink) {
- this.eventSink = eventSink;
-
- eventSink.success("主动发送消息给flutter");
- }
-
- @Override
- public void onCancel(Object o) {
-
- }
-
-
- }
- );

(3)原生: IOS:
- FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;
-
- FlutterEventChannel* eventChannel = [FlutterEventChannel eventChannelWithName:@"xiaochen.flutter.io/test" binaryMessenger:controller];
- [eventChannel setStreamHandler:self];
-
-
-
-
- //回调函数:
- FlutterEventSink eventSink;
-
- - (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
- eventSink:(FlutterEventSink)events {
- eventSink = events;
-
- if (events) {
- events(@"主动发送通知到flutter");
- }
-
- return nil;
- }
-
-
-
- /// flutter不再接收
- - (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {
-
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- eventSink = nil;
- return nil;
- }

特点:双通道
(1)flutter:
- //发送
- static const SendMessage = const BasicMessageChannel('xiaochen.flutter.io/message', StandardMessageCodec());
-
- Future<String> sendMessage() async {
- String reply = await SendMessage.send('发送给Native端的数据');
- return reply;
- }
-
-
- //接收
- static const ReceiveMessage = const BasicMessageChannel('xiaochen.flutter.io/message2', StandardMessageCodec());
-
- void receiveMessage() {
- ReceiveMessage.setMessageHandler((message) async {
- print('receiveMessage: $message');
- return '返回Native端的数据';
- });
- }

(2)原生 android:
- BasicMessageChannel<Object> messageChannel = new BasicMessageChannel<Object>(getFlutterView(), "xiaochen.flutter.io/message", StandardMessageCodec.INSTANCE);
-
-
- // 接收消息监听
- messageChannel.setMessageHandler(new BasicMessageChannel.MessageHandler<Object>() {
- @Override
- public void onMessage(Object o, BasicMessageChannel.Reply<Object> reply) {
- System.out.println("onMessage: " + o);
- reply.reply("返回给flutter的数据");
- }
- });
-
-
-
-
- BasicMessageChannel<Object> messageChannel2 = new BasicMessageChannel<Object>(getFlutterView(), "samples.flutter.io/message2", StandardMessageCodec.INSTANCE);
-
- // 发送消息
- messageChannel2.send("发送给flutter的数据", new BasicMessageChannel.Reply<Object>() {
- @Override
- public void reply(Object o) {
-
- System.out.println("onReply: " + o);
- }
- });

(3)原生: IOS:
- FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;
-
- // 初始化定义
- FlutterBasicMessageChannel* messageChannel = [FlutterBasicMessageChannel messageChannelWithName:@"xiaochen.flutter.io/message" binaryMessenger:controller];
-
- // 接收消息监听
- [messageChannel setMessageHandler:^(id message, FlutterReply callback) {
- NSLog(message);
- callback(@"返回flutter端的数据");
- }];
-
-
- FlutterBasicMessageChannel* messageChannel2 = [FlutterBasicMessageChannel messageChannelWithName:@"xiaochen.flutter.io/message2" binaryMessenger:controller];
-
- // 发送消息
- [messageChannel2 sendMessage:(@"发送给flutter的数据") reply:^(id reply) {
- NSLog(reply);
- }];

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。