platform channels主要用來客戶端和宿主app之間消息的傳遞薪捍,異步的形式進(jìn)行傳遞
調(diào)用過程
- Flutter客戶端發(fā)送消息
- 原生平臺(tái)接受并返回結(jié)果(iOS響應(yīng)方法:FlutterMethodChannel)(android響應(yīng)方法:MethodChannel)
具體操作
第一步:Flutter中配置代碼觸發(fā)和接受消息
- MethodChannel配置的參數(shù)是唯一的,一般命名規(guī)范如下:域名/功能名稱
- 使用invokeMethod("方法名稱")觸發(fā)方法
class _TestNativeConnectState extends State<TestNativeConnect> {
// 命名規(guī)則:域名/功能(要唯一 )
static const platform1 = const MethodChannel("cy.com/getMessate");
String _nativeMessate = "null";
@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: [
Text("獲取原生傳遞數(shù)據(jù):${_nativeMessate}"),
RaisedButton(
child: Text("向原生獲取數(shù)據(jù)"),
onPressed: getDataFromNative,
)
],
),
);
}
Future<void> getDataFromNative() async {
final result = await platform1.invokeMethod("getDataFromNative");//挑起方法
setState(() {
_nativeMessate = result;
});
}
}
OC代碼:
FlutterViewController *controller = (FlutterViewController*)self.window.rootViewController;
FlutterMethodChannel *channel = [FlutterMethodChannel methodChannelWithName:@"cy.come/getMessate" binaryMessenger:controller.binaryMessenger];
__weak typeof(self) weakSelf = self;
[channel setMethodCallHandler:^(FlutterMethodCall *call,FlutterResult result){
if([@"getDataFromNative" isequalToString:call.method]){
//result([FlutterError errorWithCode:@"5000",message:"錯(cuò)誤信息",details:nil]);
result(@"iOS - OC");
}
else{
result(FlutterMethodNotImplemented);
}
}];
第二步:iOS中響應(yīng)并傳遞消息
// 獲取Flutter ViewController
let controller : FlutterViewController = window.rootViewController! as! FlutterViewController
// 創(chuàng)建FlutterMethodChannel
// 參數(shù)一:與flutter中設(shè)置的MethodChannel標(biāo)識(shí)對(duì)齊 參數(shù)二:二進(jìn)制消息
let channel = FlutterMethodChannel(name: "cy.com/getMessate", binaryMessenger: controller.binaryMessenger)
// 監(jiān)聽channel調(diào)用方法
channel.setMethodCallHandler { (call:FlutterMethodCall, result:@escaping FlutterResult) in
guard call.method == "getDataFromNative" else{//判斷方法是否實(shí)現(xiàn)
result(FlutterMethodNotImplemented);//返回當(dāng)前方法未實(shí)現(xiàn)
return
}
// 返回錯(cuò)誤信息
// result(FlutterError(code: "5000", message: "消息不存在", details: nil))
result("iOS")
}
第三步:Android中響應(yīng)并傳遞消息
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
// 創(chuàng)建methodchannel
val methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger,"cy.com/getMessate");
// 添加回調(diào)
methodChannel.setMethodCallHandler{
call, result ->
if (call.method == "getDataFromNative"){
result.success("android")
result.error("5000","拋出異常",null)
}else{
result.notImplemented()
}
}
}