Flutter和Android原生通信的三种方式
简介
Flutter虽然有强大的跨平台能力,但是其跨平台主要体现在UI界框架上,对于一些Android原生的功能如:获取电池电量,访问手机蓝牙,定位等硬件信息显得有些不足心。还是需要调用Android原生方法获取。所以使用Flutter和Android原生通信的方式是必不可少的。 本文正在参加「金石计划」
本文主要介绍Flutter与Android原生三种通信方式的用法。
1.BasicMessageChannel
定义
双向通信,,有返回值,主要用于传递字符串和半结构化的信息。
基本使用
1)Flutter端
- 创建BasicMessageChannel对象并定义channel的name,必须和Android一端保持一致。
late BasicMessageChannel<String> _messageChannel;
_messageChannel = const BasicMessageChannel<String>("baseMessageChannel",
StringCodec());
- 设置setMessageHandler监听Android原生发送的消息。
_messageChannel.setMessageHandler((message) async {
print("flutter :Message form Android reply:$message");
return "flutter already received reply ";
});
- 发送消息给Android原生。
_messageChannel.send("Hello Android,I come form Flutter");
2)Android端
- 初始化BasicMessageChannel,定义Channel名称。
val messageChannel = BasicMessageChannel<String>(
flutterEngine.dartExecutor.binaryMessenger,
"baseMessageChannel",StringCodec.INSTANCE)
- 设置setMessageHandler监听来自Flutter的消息。
messageChannel.setMessageHandler { message, reply ->
Log.i("flutter", "android receive message form flutter :$message")
}
- 主动发送消息给Flutter。
messageChannel.send("flutter")
打印结果如下:
从用法上来看,Flutter和Android原生基本上是一样的,只不过是不同语言的不同写法。Flutter端主动调用send方法将消息传递给Android原生。然后打印log日志。
2.EventChannel
定义
基本使用
单向通信,是一种Android native向Flutter发送数据的单向通信方式,Flutter无法返回任何数据给Android native。主要用于Android native向Flutter发送手机电量变化、网络连接变化、陀螺仪、传感器等信息,主要用于数据流的通信
1)Flutter端
- 创建EventChannel对象,并给定channel名称。
late EventChannel _eventChannel;
_eventChannel = const EventChannel("eventChannel");
- 使用receiveBroadcastStream接收Android端的消息。
_eventChannel.receiveBroadcastStream().listen( (event){
print("Flutter:Flutter receive from Android:$event");
},onDone: (){
print("完成");
},onError: (error){
print("失败:$error");
});
2)Android端
- 创建EventChannel对象,并定义channel的name。
val eventChannel = EventChannel(flutterEngine.dartExecutor.binaryMessenger,"eventChannel")
- 设置setStreamHandler监听。
eventChannel.setStreamHandler(object :StreamHandler{
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
eventSink = events
}
override fun onCancel(arguments: Any?) {
}
})
- 发送消息给Flutter端。
Handler(mainLooper).postDelayed({
Log.i("flutter", "android send message")
eventSink?.success("Hello Flutter")
},500)
打印结果如下:
EventChannel是单向通信,并且只能从Android原生端发送消息给Flutter,Flutter不可以主动发消息,使用有局限性。
3.MethodChannel
定义
双向异步通信,Flutter和原生端都可以主动发起,同时可以互相传递数据,用于传递方法调用。
基本使用
1)Flutter
- 创建MethodChannel对象,并定义通道名称。
late MethodChannel _methodChannel;
_methodChannel = const MethodChannel('methodChannel');
- 设置setMethodCallHandler异步监听消息。
_methodChannel.setMethodCallHandler((call) async {
});
- 调用invokeMethod方法发送消息给Android,并接收返回值。
var map = {'name':'小明','age':18};
String result = await _methodChannel.invokeMethod('openMethodChannel',map);
print("Flutter接收Android返回的结果:$result");
2)Android端
- 创建MethodChannel对象,并定义通道名称。
val methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,"methodChannel")
- 设置setMethodCallHandler监听Flutter消息,并通过MethodCall.method区分方法名。
methodChannel.setMethodCallHandler { call, result ->
if (call.method == "openMethodChannel"){
val name = call.argument<String>("name")
val age = call.argument<Int>("age")
Log.i("flutter", "android receive form:$name ,$age ")
result.success("success")
}
}
- 发送消息给Flutter。
messageChannel.send("Hello Flutter")
打印结果如下:
MethodChannel是Flutter和Android原生常用的通信方式,不仅可以异步通信,还能传递数据集合,Map等。通过定义不同的方法名,调用Android不同的功能。
总结
本文主要介绍Flutter与Android原生的三种通信方式,可以根据实际开发中的业务,选择合适的通信方式。熟练掌握三种通信方式可以在Flutter开发中使用Android原生提供的功能。
链接:https://juejin.cn/post/7220295071060164663
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。