[英]How to invoke Objective-C method from Javascript and send back data to Javascript in iOS?
[英]How to invoke Method in native IOS to send data to Flutter?
我需要将一些数据从本机 IOS 端发送到 dart 端。 我正在使用 Channel Method 从 IOS 端调用该方法,但我注意到:
Flutter 侧面:
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");
}
}
原生 IOS 端:
let controller: FlutterViewController = window?.rootViewController as! FlutterViewController
let batteryChannel = FlutterMethodChannel(name: "samples.flutter.dev/battery",binaryMessenger: controller.binaryMessenger)
batteryChannel.invokeMethod("someMethod", arguments: "someValue")
注意:反之亦然!
我已经测试过了。 一般来说,使用FlutterMethodChannel
实例调用invokeMethod
。 现在我展示一些基于电池频道演示的测试代码。
在 AppDelegate 添加一个属性
//didFinishLaunchingWithOptions methods
var batteryChannel : FlutterMethodChannel!
batteryChannel = FlutterMethodChannel.init(name: "samples.flutter.dev/battery", binaryMessenger: controller.binaryMessenger)
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)
}
}
现在在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}");
});
}
}
单击Get Battery Level
按钮后,2 秒后,您可以看到init state setMethodCallHandler nativeCallSomeFlutterMethod
Since Dart 2.18, you can also call Objective-C and Swift code directly using Dart's Foreign Function Interface (FFI).
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.