flutter和原生iOS,android通信分为一次性通信(一问一答)MethodChannel和持续通信(一次调用多次传值) EventChannel.
EventChannel通常应用于在flutter端进行监听, 当原生端有什么变化。比如随着时间推移数据产生了变化需要持续性的更新数据
一、flutter端注册和调用
1、引入
const platformEvent = EventChannel("flutterEventChannel");
2、注册监听
注册回调方法, 原生有回调会持续在此监听中获取值
platformEvent.receiveBroadcastStream("init").listen((event) {
// 比如event可能是一个json字符串
},
onError: (e){
},
onDone: () {
});
二、iOS端注册和回调
1、声明FlutterEventChannel
var eventChannel: FlutterEventChannel?
// 需要回调时使用
var enentSink:FlutterEventSink?
2、实现FlutterEventChannel
eventChannel = FlutterEventChannel(name: "flutterEventChannel", binaryMessenger: controller.binaryMessenger)
eventChannel?.setStreamHandler(self)
3、实现FlutterStreamHandler代理
func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
enentSink = events
return nil;
}
func onCancel(withArguments arguments: Any?) -> FlutterError? {
enentSink = nil
return nil;
}
4、开始回调
在需要的地方把值传递给flutter
enentSink?("要传递的信息X")
三、android端注册和回调
1、声明EventSink
private EventChannel.EventSink eventSink;
2、注册和实现代理方法
new EventChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "flutterEventChannel")
.setStreamHandler(
new EventChannel.StreamHandler() {
@Override
public void onListen(Object arguments, EventChannel.EventSink events) {
eventSink = events;
}
@Override
public void onCancel(Object arguments) {
eventSink = null;
}
}
);
3、在需要的地方进行回调传值给flutter
eventSink.success(inout);
四、相对于一次性传值, 持续性传值的使用还是比较少的
MethodChannel和EventChannel同时掌握后配合使用效果更佳
场景:
1、MethodChannel启动某个耗时操作, 2、利用EventChannel来传输耗时操作的进度变化