Ahm*_*rie 4 ios dart swift flutter
我需要从原生IOS端发送一些数据到dart端。我正在使用 Channel Method 从 IOS 端调用该方法,但我注意到:
颤振侧:
static const platform = const MethodChannel('samples.flutter.dev/battery');
platform.setMethodCallHandler(myUtilsHandler); // I am calling it in initState
Future<dynamic> myUtilsHandler(MethodCall methodCall) async {
print("myUtilsHandler");
switch (methodCall.method) {
case "someMethod":
print(json.decode(methodCall.arguments));
break;
case 'someMethod2':
print("someMethod2");
break;
default:
print("default");
}
}
Run Code Online (Sandbox Code Playgroud)
本机IOS端:
let controller: FlutterViewController = window?.rootViewController as! FlutterViewController
let batteryChannel = FlutterMethodChannel(name: "samples.flutter.dev/battery",binaryMessenger: controller.binaryMessenger)
batteryChannel.invokeMethod("someMethod", arguments: "someValue")
Run Code Online (Sandbox Code Playgroud)
注意:反过来也可以正常工作!
小智 7
我已经测试过。一般情况下,使用FlutterMethodChannel实例调用invokeMethod。现在我展示一些基于batteryChannel demo的测试代码。
在 AppDelegate 中添加一个属性
//didFinishLaunchingWithOptions methods
var batteryChannel : FlutterMethodChannel!
batteryChannel = FlutterMethodChannel.init(name: "samples.flutter.dev/battery", binaryMessenger: controller.binaryMessenger)
Run Code Online (Sandbox Code Playgroud)
private func receiveBatteryLevel(result: FlutterResult) {
let device = UIDevice.current;
device.isBatteryMonitoringEnabled = true;
//test send message
sendMessageToFlutter()
if (device.batteryState == UIDevice.BatteryState.unknown) {
result(FlutterError.init(code: "UNAVAILABLE",
message: "Battery info unavailable",
details: nil));
} else {
result(Int(device.batteryLevel * 100));
}
}
private func sendMessageToFlutter(){
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
self.batteryChannel.invokeMethod("nativeCallSomeFlutterMethod", arguments: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
现在在flutter方面,也基于 batteryChannel demo
class _MyHomePageState extends State<MyHomePage> {
static const platform = const MethodChannel('samples.flutter.dev/battery');
void initState(){
super.initState();
platform.setMethodCallHandler((call) {
print("init state setMethodCallHandler ${call.method}");
});
}
}
Run Code Online (Sandbox Code Playgroud)
点击Get Battery Level按钮后,2秒后,你可以看到
init state setMethodCallHandler nativeCallSomeFlutterMethod