当前位置:   article > 正文

Flutter与原生的通信(Android/IOS版)_flutter 与ios原生通信call.arguments取值

flutter 与ios原生通信call.arguments取值

Flutter 官方提供 MethodChannel、EventChannel、BasicMessageChannel 三种方式与原生通信

1.MethodChannel

     特点:单方请求响应(flutter->原生)

  (1) flutter:

  1. static const platform = const MethodChannel('xiaochen.flutter.io/battery');
  2. try {
  3. final int result = await platform.invokeMethod('getBatteryLevel');
  4. } on PlatformException catch (e) {
  5. }

   (2)原生:android 

  1. private static final String battery= "xiaochen.flutter.io/battery";
  2. new MethodChannel(getFlutterView(), battery).setMethodCallHandler(
  3. new MethodCallHandler() {
  4. @Override
  5. public void onMethodCall(MethodCall call, Result result) {
  6. // TODO
  7. if (call.method.equals("getBatteryLevel")) {
  8. //java 核心代码
  9. int batteryLevel = getBatteryLevel();
  10. if (batteryLevel != -1) {
  11. result.success(batteryLevel);
  12. } else {
  13. result.error("UNAVAILABLE", "Battery level not available.", null);
  14. }
  15. } else {
  16. result.notImplemented();
  17. }
  18. }
  19. }
  20. );

            (3)原生: IOS:

  1. FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;
  2. FlutterMethodChannel* batteryChannel = [FlutterMethodChannel
  3. methodChannelWithName:@"xiaochen.flutter.io/battery"
  4. binaryMessenger:controller];
  5. [batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
  6. // TODO
  7. if ([@"getBatteryLevel" isEqualToString:call.method]) {
  8. //IOS 核心代码
  9. int batteryLevel = [self getBatteryLevel];
  10. if (batteryLevel == -1) {
  11. result([FlutterError errorWithCode:@"UNAVAILABLE"
  12. message:@"Battery info unavailable"
  13. details:nil]);
  14. } else {
  15. result(@(batteryLevel));
  16. }
  17. } else {
  18. result(FlutterMethodNotImplemented);
  19. }
  20. }];

2.EventChannel

     特点:接收数据(原生->flutter)

  (1) flutter:

  1. static const EventChannel _eventChannel =
  2. const EventChannel('xiaochen.flutter.io/test');
  3. // 监听开始
  4. _eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);
  5. void _onEvent(Object event) {
  6. print('返回的内容: $event');
  7. }
  8. void _onError(Object error) {
  9. print('返回的错误');
  10. }

   

     (2) 原生:android

  1. private static final String test= "xiaochen.flutter.io/test";
  2. private EventChannel.EventSink eventSink;
  3. new EventChannel(getFlutterView(), test).setStreamHandler(
  4. new EventChannel.StreamHandler() {
  5. @Override
  6. public void onListen(Object o, EventChannel.EventSink eventSink) {
  7. this.eventSink = eventSink;
  8. eventSink.success("主动发送消息给flutter");
  9. }
  10. @Override
  11. public void onCancel(Object o) {
  12. }
  13. }
  14. );

     (3)原生: IOS:

      

  1. FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;
  2. FlutterEventChannel* eventChannel = [FlutterEventChannel eventChannelWithName:@"xiaochen.flutter.io/test" binaryMessenger:controller];
  3. [eventChannel setStreamHandler:self];
  4. //回调函数:
  5. FlutterEventSink eventSink;
  6. - (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
  7. eventSink:(FlutterEventSink)events {
  8. eventSink = events;
  9. if (events) {
  10. events(@"主动发送通知到flutter");
  11. }
  12. return nil;
  13. }
  14. /// flutter不再接收
  15. - (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {
  16. [[NSNotificationCenter defaultCenter] removeObserver:self];
  17. eventSink = nil;
  18. return nil;
  19. }

 

3.BasicMessageChannel

  特点:双通道

     (1)flutter:

  1. //发送
  2. static const SendMessage = const BasicMessageChannel('xiaochen.flutter.io/message', StandardMessageCodec());
  3. Future<String> sendMessage() async {
  4. String reply = await SendMessage.send('发送给Native端的数据');
  5. return reply;
  6. }
  7. //接收
  8. static const ReceiveMessage = const BasicMessageChannel('xiaochen.flutter.io/message2', StandardMessageCodec());
  9. void receiveMessage() {
  10. ReceiveMessage.setMessageHandler((message) async {
  11. print('receiveMessage: $message');
  12. return '返回Native端的数据';
  13. });
  14. }

       (2)原生 android:

      

  1. BasicMessageChannel<Object> messageChannel = new BasicMessageChannel<Object>(getFlutterView(), "xiaochen.flutter.io/message", StandardMessageCodec.INSTANCE);
  2. // 接收消息监听
  3. messageChannel.setMessageHandler(new BasicMessageChannel.MessageHandler<Object>() {
  4. @Override
  5. public void onMessage(Object o, BasicMessageChannel.Reply<Object> reply) {
  6. System.out.println("onMessage: " + o);
  7. reply.reply("返回给flutter的数据");
  8. }
  9. });
  10. BasicMessageChannel<Object> messageChannel2 = new BasicMessageChannel<Object>(getFlutterView(), "samples.flutter.io/message2", StandardMessageCodec.INSTANCE);
  11. // 发送消息
  12. messageChannel2.send("发送给flutter的数据", new BasicMessageChannel.Reply<Object>() {
  13. @Override
  14. public void reply(Object o) {
  15. System.out.println("onReply: " + o);
  16. }
  17. });

  (3)原生: IOS:

  1. FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;
  2. // 初始化定义
  3. FlutterBasicMessageChannel* messageChannel = [FlutterBasicMessageChannel messageChannelWithName:@"xiaochen.flutter.io/message" binaryMessenger:controller];
  4. // 接收消息监听
  5. [messageChannel setMessageHandler:^(id message, FlutterReply callback) {
  6. NSLog(message);
  7. callback(@"返回flutter端的数据");
  8. }];
  9. FlutterBasicMessageChannel* messageChannel2 = [FlutterBasicMessageChannel messageChannelWithName:@"xiaochen.flutter.io/message2" binaryMessenger:controller];
  10. // 发送消息
  11. [messageChannel2 sendMessage:(@"发送给flutter的数据") reply:^(id reply) {
  12. NSLog(reply);
  13. }];

  

  

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号