Flutter-Native消息通道
- BasicMessageChannel:用于传递字符串和半结构化的消息
- EventChannel:用于数据流(event streams)的通信
- MethodChannel:用于传递方法调用(method invocation)
一、BasicMessageChannel
Flutter端:
1,创建BasicMessageChannel:
String? _message = '';
static const _channel = BasicMessageChannel("messageChannel", StringCodec());
2,写一个接收函数,返回一个值
@override
void initState() {
super.initState();
//通过BasicMessageChannel实例,注册一个接收回调,并且返回信息。
_channel.setMessageHandler((message) async{
print("receive message: $message");
setState(() {
_message = message;
});
return 'ACK from dart';
});
}
3,发送
Future<void> _sendMessage() async{
String? message = await _channel.send("Hello from dart");
print("Send message: $message");
}
Android端:
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
//1. 初始化BasicMessageChannel,并传入名称,名称需要和dart内完全一致
var channel = BasicMessageChannel(flutterEngine.dartExecutor.binaryMessenger,"messageChannel",StringCodec.INSTANCE)
//2. 通过BasicMessageChannel实例注册接收回调,并且返回ACK
channel.setMessageHandler { message, reply ->
Log.d("flutter","Android receive message:$message")
reply.reply("ACK from Android")
Handler(Looper.getMainLooper()).postDelayed({
//3. 通过BasicMessageChannel实例发送消息给dart
channel.send("Hello from Android")
},1000)
}
}
}
二、EventChannel
Flutter端:
1、创建一个EventChannel实例,传入通道名称,名称需要和Native侧完全一致
static const _channel = EventChannel("eventChannel");
2、通过EventChannel实例,注册一个接收回调,并且返回消息
@override
void initState() {
super.initState();
_channel.receiveBroadcastStream().listen((event){
print("receive:$event");
setState({
_message = event;
});
},onError:(error){
print("receive error:$error");
},cancelError: true);
}
Android端:
//1. 初始化EventChannel,并传入名称,名称需要和dart内完全一致
val channel = EventChannel(flutterEngine.dartExecutor.binaryMessenger,"eventChannel")
//2. 设置事件流的Handler
channel.setStreamHandler(object:EventChannel.StreamHandler{
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
eventSink = events
Log.d("flutter","EventChannel onListened")
Handler(Looper.getMainLooper()).postDelayed({
Log.d("flutter","send ACK from Android")
eventSink?.success("ACK from Android")
},1000)
}
override fun onCancel(arguments: Any?) {
Log.d("flutter","EventChannel onCanceled")
}
})
三、方法通道
1、Flutter端
//1. 创建一个MethodChannel实例,传入通道名称,名称需要和Native完全一致
static const _channel = MethodChannel("methodChannel");
@override
void initState() async{
super.initState();
final Map<String,dynamic> map = {
'name':'flutter',
'version':'3.0.1',
'android_api':31
};
String result = await _channel.invokeMethod("getFlutterInfo",map);
print("Method invoke result: $result")
}
2、Android端
//1. 初始化MethodChannel,并传入名称,名称需要和dart内完全一致
val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,"methodChannel")
//2. 注册MethodChannel处理器
channel.setMethodCallHandler { call, result ->
if(call.method == "getFlutterInfo"){
val name = call.argument<String>("name")
val version = call.argument<String>("version")
}
}