Flutter混合开发(三)通讯交互
书接上文,这篇文章就来简单介绍一下flutter和原生的通讯交互,首先简单介绍下flutter定义的几个通道
- BasicMessageChannel:传递字符串或半结构化信息;
- MethodChannel:传递方法调用(method invocation);
- EventChannel:数据流(event streams)通讯。
而这三个类的成员变量都是一致的
private final BinaryMessenger messenger;//用于发送二进制数据
private final String name;// channel 的名字,全局唯一
private final MethodCodec codec;//MessageCodec 或 MethodCodec 类型,消息的编码解码器
private final BinaryMessenger.TaskQueue taskQueue;//用来调用原生Handler
当我们初始化一个Channel,并向该Channel注册处理消息的Handler时,实际上会生成一个与之对应的BinaryMessageHandler,并以channel name为key,注册到BinaryMessenger中。当Flutter端发送消息到BinaryMessenger时,BinaryMessenger会根据其入参channel找到对应的BinaryMessageHandler,并交由其处理。
下面来简单实现下原生端代码
//flutterEngine在上篇文章实现过了,这里直接引用不粘贴了
new MethodChannel(new ShimPluginRegistry(flutterEngine).registrarFor("fengdongliuxiang").messenger(), "fengdongliuxiang").setMethodCallHandler(
new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, MethodChannel.Result result) {
if (call.method.equals("setText")) {
result.success("我真帅");
System.out.println("发送成功");
} else {
result.notImplemented();
}
}
}
);
接着来实现flutter端代码
String str = "Hello Flutter";
MethodChannel _channel = MethodChannel("fengdongliuxiang");
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("我是flutter"),
leading: IconButton(
onPressed: () {
print(Navigator.defaultRouteName);
SystemNavigator.pop();
},
icon: const Icon(Icons.chevron_left),
),
),
body: Column(
children: [
Center(
child: Text(str),
),
TextButton(
onPressed: () {
print("设置文本");
setText();
},
child: Text('设置文本'))
],
),
);
}
Future setText() async {
str = await _channel.invokeMethod("setText");
setState(() {
print(str);
});
}
运行效果如下
除此之外,也可以用实现接口的方式来创建一个类,这种写法通常用在插件制作中
package com.example.nativetest;
import android.app.Activity;
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.PluginRegistry.Registrar;
public class FlutterPluginDemo implements FlutterPlugin, MethodCallHandler {
private MethodChannel channel;
private Activity activity;
FlutterPluginDemo(Activity activity) {
this.activity = activity;
}
public void registerWith(Registrar registrar) {
channel = new MethodChannel(registrar.messenger(), "fengdongliuxiang");
FlutterPluginDemo instance = new FlutterPluginDemo(registrar.activity());
//setMethodCallHandler在此通道上接收方法调用的回调
channel.setMethodCallHandler(instance);
}
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
channel = new MethodChannel(binding.getFlutterEngine().getDartExecutor(), "fengdongliuxiang");
channel.setMethodCallHandler(this);
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
if (call.method.equals("setText")) {
result.success("我真帅");
System.out.println("发送成功");
}else {
result.notImplemented();
}
}
}
调用如下
FlutterPluginDemo flutterPluginDemo=new FlutterPluginDemo(SecondPage.this);
ShimPluginRegistry shimPluginRegistry = new ShimPluginRegistry(flutterEngine);
flutterPluginDemo.registerWith(shimPluginRegistry.registrarFor("fengdongliuxiang"));
总结
以上就是简单的通讯交互了,实际开发中应用到的远不止于此,更多的用法就留在以后再讨论吧,下一篇文章应该会更新Android音视频笔记系列,如果各位觉得有帮助不妨点个赞,谢谢。
转载自:https://juejin.cn/post/7353208973880082482