Flutter学习-Platform Channel的使用

一、前言

上一篇已经详细说明了Flutter和平台间交互的channel类型、参数等,现在来看一下实际怎么使用?

二、MethodChannel的使用

适应于Flutter端和本地之间方法的相互调用。即Flutter端可以调用本地方法,本地端也可以调用Flutter端的方法。
如Flutter端可以调用本地方法过程如下:
Flutter调用一个本地的方法,本地方法执行,最终以一个错误或者信息为响应。这种方法调用可以获取当前电池的状态、网络状态信息或者温度数据。一旦本地方法做出相应,就不会再发送任何的信息,直到下次方法调用。
反过来,本地也可以同样的调用Flutter端的方法。
应用场景:
比如Flutter端获取系统版本号等信息,建议使用该MethodChannel进行获取。下面演示下示例(相互调用):

Android端代码:
在Activity中创建MethodChannel,设置MethodCallHandler(用于处理Flutter端调用的方法等),再MethodCallHandler中接收Flutter端的调用方法(如getPlatformVersion),并返回result。如果不需要返回,可以不写result。
同样的,可以主动执行invokeMethod方法,调用Flutter端的方法。

    final MethodChannel channel = new MethodChannel(registrar.messenger(), "flutter_plugin_test");
    channel.setMethodCallHandler(new MethodCallHandler() {
      @Override
      public void onMethodCall(MethodCall methodCall, Result result) {
      //1.接收Flutter端的调用
        if (methodCall.method.equals("getPlatformVersion")) {
          result.success("Android " + android.os.Build.VERSION.RELEASE);
        } else {
          result.notImplemented();
        }
      }
    });
  //2.调用Flutter端方法
      channel.invokeMethod("getName", null);

Flutter端:
创建对应的MethodChannel ,名称同Android端。通过invokeMethod调用本地方法(如下:getPlatformVersion)。
同样的,可以setMethodCallHandler,进行平台端的方法调用(如下:getName)。
值得注意的是:
flutter 中的 methodHandler 接收到方法调用,再做相关处理。与 flutter 调用原生不一样,原生调用 fultter 方法是没有返回值的。


  static const MethodChannel _channel =
      const MethodChannel('flutter_plugin_test');

  static Future get platformVersion async {
  //调用本地方法getPlatformVersion
    final String version = await _channel.invokeMethod('getPlatformVersion');
    return version;
  }
  static void init() {
    Future handlerMethod(MethodCall call) async {
      switch (call.method) {
        case "getName":
              print("getName in xxx");
          break;
      }
      _channel.setMethodCallHandler(handlerMethod);
    }
  }
  }

三、EventChannel的使用

上面的MethodChannel,主要是方法的调用。而EventChannel主要是流数据传递。可以互相主动通知。即本地和flutter可以互相进行数据传递。
Android端代码:
在Activity中创建EventChannel,设置setStreamHandler(用于监听Flutter端的状态),再StreamHandler中监听。 onListen是当flutter端建立channel,并开始监听本地事件时候的回调;
onCancel是当Flutter端取消监听时候的回调。

  EventChannel channel2 = new EventChannel(registrar.messenger(), "flutter_event_plugin");
   channel2.setStreamHandler(new EventChannel.StreamHandler() {
      @java.lang.Override
      public void onListen(java.lang.Object o, EventChannel.EventSink eventSink) { //flutter调用平台事件
          eventSink.success("Flutter监听成功");
      }
            @java.lang.Override
      public void onCancel(java.lang.Object o) {
          Log.i("EventChannel", "Flutter取消监听.");

      }
    });

Flutter端代码
创建对应的channel,通过receiveBroadcastStream开始监听本地的事件。event为平台端发送过来的数据。(示例里面就是Flutter监听成功的字符数据)。

  void initEventChannel() {
  EventChannel('flutter_event_plugin').receiveBroadcastStream().listen((event) {
        print("收到本地消息 receiveBroadcastStream $event");
  });
  }

四、BasicMessageChannel的使用

BasicMessageChannel用于传递字符串和半结构化的信息的传递,可以实现互相通信。
Android端:
在Activity中创建BasicMessageChannel ,设置setMessageHandler(用于监听Flutter端的消息)。
可以通过send,发送消息到Flutter端。参数是一个对象即可。

      BasicMessageChannel channel1 = new BasicMessageChannel(registrar.messenger(), "flutter_message_plugin", StringCodec.INSTANCE );
    channel1.setMessageHandler(new BasicMessageChannel.MessageHandler() {
      @java.lang.Override
      public void onMessage(java.lang.Object object, BasicMessageChannel.Reply reply) {  //flutter发送消息到平台测
        Log.i("BasicMessageChannel", "接收到Flutter的消息:" + object);
      }
    });
    channel1.send("发送消息到Flutter");

Flutter端:
创建对应的channel,通过setMessageHandler开始监听本地的事件。同时,可以通过send,发送消息到本地端。

  BasicMessageChannel channel = BasicMessageChannel('flutter_message_plugin', StringCodec());
  channel.setMessageHandler((message) {
       print("接收到来自Native的消息");

  });
  channel.send("发送消息到Native");
  }

五、总结

本文对Flutter和Native之间互相通信使用举例了一些。但是其使用还是要自己去看看源代码。这个只是粗略的概述。

你可能感兴趣的:(Flutter框架)