一、前言

上一篇已经详细说明了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)。

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":

return "Hello from Flutter";

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之间互相通信使用举例了一些。但是其使用还是要自己去看看源代码。这个只是粗略的概述。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐