如何调用原生IOS中的Method向Flutter发送数据?

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