BasicMessageChannel 用法
Native端
BasicMessageChannel(@NonNull BinaryMessenger messenger, @NonNull String name, @NonNull MessageCodec<T> codec)
BinaryMessenger messenger
消息信使,是消息的发送与接收工具String name
Channel名字,唯一标识符MessageCodec<T> codec
消息的编解码器
void setMessageHandler(BasicMessageChannel.MessageHandler<T> handler)
BasicMessageChannel.MessageHandler<T> handler
消息处理器,配合BinaryMessager
完成消息的处理。
在创建好BasicMessageChannel
后,如果要让其接收来自Dart发来额消息,则需要调用它的setMessageHandler
方法为其设置一个消息处理器。
public interface MessageHandler<T> {
void onMessage(@Nullable T message, @NonNull Reply<T> reply);
}
onMessage(@Nullable T message, @NonNull Reply<T> reply)
用于接收消息,message 是消息内容,reply是回复此消息的回调函数。
void send(@Nullable T message)
void send(@Nullable T message, @Nullable final Reply<T> callback)
T message
要发送的消息Reply<T> callback
消息发出去后,收到Dart回复的消息函数
在创建好BasicMessageChannel
后,如果要向Dart发送消息,可以调用它的send
方法向Dart传递数据。
public class BasicMessageChannelPlugin implements BasicMessageChannel.MessageHandler<String> {
private Activity activity;
private BasicMessageChannel<String> messageChannel;
public BasicMessageChannelPlugin(Activity activity, BinaryMessenger binaryMessenger) {
this.activity = activity;
messageChannel = new BasicMessageChannel<>(binaryMessenger, "channel", StringCodec.INSTANCE);
// 设置消息处理器,处理来自Dart的消息
messageChannel.setMessageHandler(this);
}
/**
* 接收处理来自Dart的消息
*
* @param message
* @param reply
*/
@Override
public void onMessage(@Nullable String message, @NonNull BasicMessageChannel.Reply<String> reply) {
// 回复Dart端消息
reply.reply("接收到来自Dart的消息:" + message);
if (activity instanceof IShowMessage) {
((IShowMessage) activity).onShowMessage(message);
}
Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
}
/**
* 向Dart传递消息,并接受Dart的反馈
*
* @param message
* @param callback
*/
void send(String message, BasicMessageChannel.Reply<String> callback) {
messageChannel.send(message,callback);
}
}
Dart端
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
方法调用。
public class MethodChannelPlugin implements MethodChannel.MethodCallHandler {
private Activity activity;
private MethodChannel methodChannel;
public MethodChannelPlugin(Activity activity, BinaryMessenger binaryMessenger) {
this.activity = activity;
methodChannel = new MethodChannel(binaryMessenger, "channel");
// 设置消息处理器,处理来自Dart的消息
methodChannel.setMethodCallHandler(this);
}
/**
* 向Dart传递消息,并接受Dart的反馈
*
* @param message
* @param callback
*/
void send(String message, BasicMessageChannel.Reply<String> callback) {
methodChannel.invokeMethod(message, callback);
}
/**
* 接收处理来自Dart的消息
*
* @param call
* @param result
*/
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
switch (call.method) {
case "showMessage":
showMessage(call.arguments());
break;
default:
result.notImplemented();
}
}
/**
* 显示从Dart端传递的消息
*
* @param arguments
*/
private void showMessage(String arguments) {
if (activity instanceof IShowMessage) {
((IShowMessage) activity).onShowMessage(arguments);
}
}
}
Dart端
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)
StreamHandler handler
消息处理器,配合BinaryMessager完成消息的处理,在创建好EventChannel后,如果要让其接收Dart发来的消息,则需要调用它的setStreamHandler
方法为其设置一个消息处理器。
public interface StreamHandler {
void onListen(Object arguments, EventSink events);
void onCancel(Object arguments);
}
void onListen(Object arguments, EventSink events)
Flutter Native 监听事件时调用,Object arguments
是传递的参数,EventSink events
是 Native 回调Dart时的回调函数,EventSink
提供success
、error
与endOfStream
三个回调方法分别对应事件的不同状态。void onCancel(Object arguments)
Native 取消监听时调用
public class EventChannelPlugin implements EventChannel.StreamHandler {
private List<EventChannel.EventSink> eventSinks = new ArrayList<>();
static EventChannelPlugin registerWith(Activity activity, BinaryMessenger binaryMessenger) {
EventChannelPlugin eventChannelPlugin = new EventChannelPlugin();
new EventChannel(binaryMessenger, "channel")
.setStreamHandler(eventChannelPlugin);
return eventChannelPlugin;
}
/**
* 向Dart传递消息,并接受Dart的反馈
*
* @param params
*/
void sendEvent(Object params) {
for (EventChannel.EventSink sink : eventSinks) {
sink.success(params);
}
}
@Override
public void onListen(Object arguments, EventChannel.EventSink events) {
eventSinks.add(events);
}
@Override
public void onCancel(Object arguments) {
}
}
扩展阅读
https://juejin.cn/post/6844903997866786829
https://juejin.cn/post/6844904190725062670