注册

Flutter和Android原生通信的三种方式

简介


Flutter虽然有强大的跨平台能力,但是其跨平台主要体现在UI界框架上,对于一些Android原生的功能如:获取电池电量,访问手机蓝牙,定位等硬件信息显得有些不足心。还是需要调用Android原生方法获取。所以使用Flutter和Android原生通信的方式是必不可少的。 本文正在参加「金石计划」


本文主要介绍Flutter与Android原生三种通信方式的用法。


1.BasicMessageChannel


定义


双向通信,,有返回值,主要用于传递字符串和半结构化的信息。


基本使用


1)Flutter端



  1. 创建BasicMessageChannel对象并定义channel的name,必须和Android一端保持一致。

 late BasicMessageChannel<String> _messageChannel;
_messageChannel = const BasicMessageChannel<String>("baseMessageChannel",
StringCodec());


  1. 设置setMessageHandler监听Android原生发送的消息。

_messageChannel.setMessageHandler((message) async {
print("flutter :Message form Android reply:$message");
return "flutter already received reply ";
});


  1. 发送消息给Android原生。

 _messageChannel.send("Hello Android,I come form Flutter");

2)Android端



  1. 初始化BasicMessageChannel,定义Channel名称。

val messageChannel = BasicMessageChannel<String>(
flutterEngine.dartExecutor.binaryMessenger,
"baseMessageChannel",StringCodec.INSTANCE)


  1. 设置setMessageHandler监听来自Flutter的消息。

 messageChannel.setMessageHandler { message, reply ->
Log.i("flutter", "android receive message form flutter :$message")

}


  1. 主动发送消息给Flutter。

  messageChannel.send("flutter")

打印结果如下:



从用法上来看,Flutter和Android原生基本上是一样的,只不过是不同语言的不同写法。Flutter端主动调用send方法将消息传递给Android原生。然后打印log日志。


2.EventChannel


定义


基本使用


单向通信,是一种Android native向Flutter发送数据的单向通信方式,Flutter无法返回任何数据给Android native。主要用于Android native向Flutter发送手机电量变化、网络连接变化、陀螺仪、传感器等信息,主要用于数据流的通信


1)Flutter端



  1. 创建EventChannel对象,并给定channel名称。

late EventChannel _eventChannel;
_eventChannel = const EventChannel("eventChannel");


  1. 使用receiveBroadcastStream接收Android端的消息。

 _eventChannel.receiveBroadcastStream().listen( (event){
print("Flutter:Flutter receive from Android:$event");
},onDone: (){
print("完成");
},onError: (error){
print("失败:$error");
});

2)Android端



  1. 创建EventChannel对象,并定义channel的name。

 val eventChannel  = EventChannel(flutterEngine.dartExecutor.binaryMessenger,"eventChannel")


  1. 设置setStreamHandler监听。

  eventChannel.setStreamHandler(object :StreamHandler{
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
eventSink = events
}

override fun onCancel(arguments: Any?) {
}

})


  1. 发送消息给Flutter端。

 Handler(mainLooper).postDelayed({
Log.i("flutter", "android send message")
eventSink?.success("Hello Flutter")
},500)

打印结果如下:



EventChannel是单向通信,并且只能从Android原生端发送消息给Flutter,Flutter不可以主动发消息,使用有局限性。


3.MethodChannel


定义


双向异步通信,Flutter和原生端都可以主动发起,同时可以互相传递数据,用于传递方法调用。


基本使用


1)Flutter



  1. 创建MethodChannel对象,并定义通道名称。

 late MethodChannel _methodChannel;
_methodChannel = const MethodChannel('methodChannel');


  1. 设置setMethodCallHandler异步监听消息。

 _methodChannel.setMethodCallHandler((call) async {

});


  1. 调用invokeMethod方法发送消息给Android,并接收返回值。

  var map = {'name':'小明','age':18};
String result = await _methodChannel.invokeMethod('openMethodChannel',map);
print("Flutter接收Android返回的结果:$result");

2)Android端



  1. 创建MethodChannel对象,并定义通道名称。

 val methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,"methodChannel")


  1. 设置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")
}

}


  1. 发送消息给Flutter。

  messageChannel.send("Hello Flutter")

打印结果如下:



MethodChannel是Flutter和Android原生常用的通信方式,不仅可以异步通信,还能传递数据集合,Map等。通过定义不同的方法名,调用Android不同的功能。


总结


本文主要介绍Flutter与Android原生的三种通信方式,可以根据实际开发中的业务,选择合适的通信方式。熟练掌握三种通信方式可以在Flutter开发中使用Android原生提供的功能。


作者:Android研究员
链接:https://juejin.cn/post/7220295071060164663
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册