简介
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原生供给的功用。