在開發(fā)flutter應(yīng)用的過程中, 通常需要和原生方法進(jìn)行通信, 有時還需要進(jìn)行傳值.
比如:
(1)薄扁、某些SDK不支持flutter但項目又必須要用
(2)说搅、某些原生的功能flutter不支持, 電池電量 通知是否開啟等
針對以上通信并傳值的方法進(jìn)行一個記錄
一饵蒂、flutter端實現(xiàn)
1侨拦、聲明
const platform = MethodChannel('flutterNativeChannel');
2稠通、主動調(diào)用 invokeMethod
// 不需要返回值 且不攜帶參數(shù)
await platform.invokeMethod('yourMethod');
如果需要從原生得到返回值則使用下面的方式
// 需要返回值
static Future<String> configureFlutterEngine() async {
final result;
try {
result = await platform.invokeMethod('yourMethod');
return result;
} on PlatformException catch (e) {
return "Failed : '${e.message}'.";
}
}
3层坠、如需攜帶參數(shù)傳遞給原生
// 攜帶一個map類型的數(shù)組, 通過yourMethod傳遞給原生
platform.invokeMethod('yourMethod', [{"fileName": "fName"}]);
二殖妇、iOS端實現(xiàn)
iOS端只需要進(jìn)行監(jiān)聽, 并給根據(jù)flutter的參數(shù)給出對應(yīng)的返回值, 值得注意的是yourMethod代表了一個方法標(biāo)識, 想要執(zhí)行多個通信, 需要更換不同的方法標(biāo)識, 用if else進(jìn)行判斷
1、無參數(shù)
let controller: FlutterViewController = window.rootViewController as! FlutterViewController ;
let channel = FlutterMethodChannel(name: "flutterNativeChannel", binaryMessenger: controller.binaryMessenger)
channel.setMethodCallHandler({ [self]
(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
if call.method == "yourMethod" {
result("返回給flutter的信息")
}
})
2破花、有參數(shù)
如果是需要攜帶一些參數(shù), 可通過 call.arguments直接過去, 比如我的參數(shù)是一個數(shù)組
if call.method == "yourMethod" {
let dataList: Array = call.arguments as! Array<Any>;
result("返回給flutter的信息")
}
三谦趣、安卓端實現(xiàn)
1、安卓原生注冊方法等待flutter調(diào)用
在MainActivity文件重寫configureFlutterEngine方法
// 重寫configureFlutterEngine獲取FlutterEngine
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {}
2旧乞、注冊監(jiān)聽
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "flutterNativeChannel")
.setMethodCallHandler(
(call, result) -> {
if (call.method.equals("yourMethod")) {
// 返回數(shù)據(jù)
result.success("android返回給flutter的信息");
}
});
3蔚润、獲取參數(shù)。和flutter對應(yīng)
ArrayList<Map> paramArray = (ArrayList<Map>) call.arguments();
四尺栖、注意
以上方法適合flutter調(diào)用原生方法獲取信息, 為一次性方法, 就是說, 一問一答flutter調(diào)用一次原生就智能返回一次信息.
如果有的需求是flutter調(diào)用原生方法一次, 原生需要持續(xù)性的給flutter提供信息此方式就不可以使用了, 此時需要用到EventChannel