Flutter 和 Native 通信场景
Flutter 和 Native通信机制
Flutter和Native的通信是通过Channel来完成的。
Flutter定义了三种不同类型的Channel
- BasicMessageChannel
用于传递字符串和半结构化的信息,持续通信,收到消息后可以回复此消息,如Native将遍历到的文件信息陆续传递给Dart,Flutter将从服务端获取到的信息交给Native加工,Native处理完返回等。 - MethodChannel
用于传递方法调用,一次性通信,如Flutter调用Native拍照 - EventChannel
用于数据流的通信,持续通信,收到消息后无法回复此次消息,通过常用于Native向Dart的通信,如手机电量变化、网络连接变化、陀螺仪、传感器信息等
这三种类型的Channel都是全双工通信,Dart可以主动发消息给Native,并且Native接收到消息后可以做出回应,同样,Native可以主动发送消息给Dart,Dart接收到消息后返回给Native端。
BasicMessageChannel 用法
Native端
BasicMessageChannel(@NonNull BinaryMessenger messenger, @NonNull String name, @NonNull MessageCodec<T> codec)
BinaryMessenger messenger
消息信使,是消息的发送与接收工具String name
Channel名字,唯一标识符MessageCodec<T> codec
消息的编解码器
Dart端
const BasicMessageChannel(this.name, this.codec, { BinaryMessenger? binaryMessenger })
this.name
Channel的名字,要和Native端保持一致this.codec
消息的编解码器,要和Native端保持一致
void setMessageHandler(Future<T> Function(T? message)? handler)
Future<T> handler(T message)
消息处理器,配合BinaryMessager
完成消息的处理
在创建好BasicMessageChannel
后,如果要让其接收Native发来的消息,则需要调用它的setMessageHandler
方法为其设置一个消息处理器。
Future<T?> send(T message)
T message
要传递给Native的具体信息Future<T?>
消息发出去后,收到Native回复的回调函数
在创建好BasicMessageChannel
后,如果要向Native发送消息,可以调用它的send
方法向Native传递数据。
static const BasicMessageChannel _basicMessageChannel =
const BasicMessageChannel('channel', StringCodec());
/// 设置setMessageHandler接收来自Native发来的消息,并回复Native
void _receiveMessage() {
_basicMessageChannel.setMessageHandler((message) => Future<String>(() {
setState(() {
showMessage = message;
});
return "收到Native消息${message}";
}));
}
/// 调用send发送消息
void _sendMessage(String message) async {
String response;
try {
response = await _basicMessageChannel.send(message);
} on PlatformException catch (e) {
print(e);
}
}
MethodChannel 用法
Native端
MethodChannel(BinaryMessenger messenger, String name)
MethodChannel(BinaryMessenger messenger, String name, MethodCodec codec)
BinaryMessenger messenger
消息信使,是消息的发送和接收的工具String name
Channel的名字,也是其唯一标识符MethodCodec codec
用作MethodChannel
的编解码器
void setMethodCallHandler(final @Nullable MethodCallHandler handler)
MethodCallHandler handler
消息处理器,配合BinaryMessager完成消息的处理
在创建好MethodChannel后,需要调用它的setMethodCallHandler方法为其设置一个消息处理器,以便能接收来自Dart端消息。
public interface MethodCallHandler {
void onMethodCall(@NonNull MethodCall call, @NonNull Result result);
}
onMethodCall(@NonNull MethodCall call, @NonNull Result result)
用于接收消息,call 是消息内容,它有两个成员变量String类型的call.method
表示调用的方法名,Object类型的call.arguments
表示调用方法所传递的入参,MethodChannel.Result result
是回复此消息的回调函数提供了result.success
、result.error
、result.notImplemented
方法调用。
Dart端
MethodChannel(this.name, [this.codec = const StandardMethodCodec(), BinaryMessenger? binaryMessenger ])
this.name
Channel的名字,要和Native端保持一致this.codec
消息的编解码器,要和Native端保持一致
void invokeMethod(@NonNull String method, @Nullable Object arguments)
String method
要调用的Native方法名Object arguments
传递的参数
static const MethodChannel _methodChannel = const MethodChannel('channel');
response = await _methodChannel.invokeMethod('send', 'value');
EventChannel 用法
Native端
EventChannel(BinaryMessenger messenger, String name)
EventChannel(BinaryMessenger messenger, String name, MethodCodec codec)
BinaryMessenger messenger
消息信使,是消息发送和接收的工具String name
Channel的名字,唯一标识MethodCodec codec
用作EventChannel
的编解码器
void setStreamHandler(final StreamHandler handler)
Dart端
EventChannel(this.name, [this.codec = const StandardMethodCodec(), BinaryMessenger? binaryMessenger])
this.name
Channel的名字,要和Native端保持一致this.codec
消息的编解码器,要和Native端保持一致
Stream<dynamic> receiveBroadcastStream([ dynamic arguments ])
dynamic arguments
监听事件向Native传递的数据
初始化一个广播流用于从channel中接收数据,它返回一个Sream,接下来需要调用Stream的listen
方法来完成注册,另外在页面销毁时调用Stream的cancel
方法来取消监听。
StreamSubscription _streamSubscription;
@override
void initState() {
super.initState();
_streamSubscription = _eventChannel
.receiveBroadcastStream()
.listen(_onToDart, onError: _onToDartError);
}
@override
void dispose() {
if(_streamSubscription!=null) {
// 取消消息监听
_streamSubscription.cancel();
_streamSubscription = null;
}
super.dispose();
}
void _onToDart(message) {
setState(() {
showMessage = message;
});
}
void _onToDartError(e) {
print(e);
}
参考文章
https://www.jianshu.com/p/af8b337356e2
https://juejin.cn/post/6844903997866786829