繁体   English   中英

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

[英]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).

更多信息: https://medium.com/dartlang/dart-2-18-f4b3101f146c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM