Flutter通信机制 Dart端
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端保持一致
setMessageHandler 方法原型
void setMessageHandler(Future<T> Function(T? message)? handler)
Future<T> handler(T message)
消息处理器,配合BinaryMessager
完成消息的处理
在创建好BasicMessageChannel
后,如果要让其接收Native发来的消息,则需要调用它的setMessageHandler
方法为其设置一个消息处理器。
send 方法原型
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
的编解码器
setMethodCallHandler 方法原型
void setMethodCallHandler(final @Nullable MethodCallHandler handler)
MethodCallHandler handler
消息处理器,配合BinaryMessager完成消息的处理
在创建好MethodChannel后,需要调用它的setMethodCallHandler方法为其设置一个消息处理器,以便能接收来自Dart端消息。
MethodChannel.MethodCallHandler 原型
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端保持一致
invokeMethod 方法原型
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
的编解码器
setStreamHandler 方法原型
void setStreamHandler(final StreamHandler handler)
Dart端
构造方法原型
EventChannel(this.name, [this.codec = const StandardMethodCodec(), BinaryMessenger? binaryMessenger])
this.name
Channel的名字,要和Native端保持一致this.codec
消息的编解码器,要和Native端保持一致
receiveBroadcastStream 方法原型
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
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgakhji
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01