Flutter与原生交互方式之MethodChannel使用
MethodChannel
是Flutter
与原生交互的一种方式,此种方式传递的是方法,可以双向传递,可以携带参数,双向传递都可以有返回值
Flutter
给原生端发送消息
Flutter
端代码配置
final methodChannel = const MethodChannel('test_method_channel');
Future<void> sendMessageFromMethodChannel() async {
final result = await methodChannel.invokeMethod("method_one");
print(result);
}
定义发送消息 MethodChannel
生成对应的channel
,需要指定channel
的name
发送消息使用的是:invokeMethod
指定方法名,也可以带参数,有返回值
- 原生端代码配置
先定义一个MethodChannelManager
管理类
var channel: FlutterMethodChannel
init(messager: FlutterBinaryMessenger) {
channel = FlutterMethodChannel(name: "test_method_channel", binaryMessenger: messager)
channel.setMethodCallHandler { (call , result) in
print("接收到了来自Flutter发送的方法\(call.method)")
result("我是原生返回给Flutter的消息")
}
}
定义好channel
,注册方法 setMethodCallHandler
在AppDelegate
入口函数处需要初始化
let messager = window.rootViewController as! FlutterBinaryMessenger
MethodChannelManager(messager: messager)
运行项目后,点击触发事件,打印如下:
原生(iOS为例)
给Flutter
发送消息
iOS
原生端配置
var channel: FlutterMethodChannel
init(messager: FlutterBinaryMessenger) {
channel = FlutterMethodChannel(name: "test_method_channel", binaryMessenger: messager)
channel.setMethodCallHandler { (call , result) in
print("接收到了来自Flutter发送的方法\(call.method)")
result("我是原生返回给Flutter的消息")
self.startTimer()
}
}
func startTimer() {
Timer.scheduledTimer(timeInterval: TimeInterval(2), target: self, selector: #selector(sendMessageToFlutter), userInfo: nil, repeats: false)
}
@objc func sendMessageToFlutter() {
channel.invokeMethod("ios_method", arguments: "我是原生主动发送过来的") {(result) in
print(result)
}
}
原生端发送消息也是调用 invokeMethod
,也可以以闭包形式接收到Flutter
端的返回值
Flutter
端配置
Future<void> setMethodChannelCallHandler() async {
methodChannel.setMethodCallHandler((call) async {
print('Flutter收到了原生端的方法:${call.method}, 传参为:${call.arguments} ---- call: $call');
return Future.value('我是Flutter回传给原生端的数据');
});
}
@override
void initState() {
// TODO: implement initState
super.initState();
setMethodChannelCallHandler();
}
Flutter
中配置的setMethodChannelCallHandler
也可以给原生回传数据,直接返回一个 Future
即可
运行打印结果如下: