【问题标题】:How to invoke Method in native IOS to send data to Flutter?如何在原生 IOS 中调用 Method 向 Flutter 发送数据?
【发布时间】:2020-09-05 16:13:10
【问题描述】:

我需要将一些数据从本地 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");
    }
  }

原生IOS端:

let controller: FlutterViewController = window?.rootViewController as! FlutterViewController
    let batteryChannel = FlutterMethodChannel(name: "samples.flutter.dev/battery",binaryMessenger: controller.binaryMessenger)
batteryChannel.invokeMethod("someMethod", arguments: "someValue")

注意:反之亦然!

【问题讨论】:

  • 所有最好的示例代码都存在于插件项目中,因此创建一个插件项目并依赖于您的主项目是一个好主意。另外,请确保您从主 iOS 线程调用 invokeMethod

标签: ios swift flutter dart


【解决方案1】:

我已经测试过了。 一般情况下,使用FlutterMethodChannel 实例调用invokeMethod。 现在我展示一些基于batteryChannel demo的测试代码。

在 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)
        }
    }

现在在颤振方面,也是基于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

【讨论】:

    猜你喜欢
    • 2020-07-28
    • 2021-09-15
    • 2019-03-17
    • 2019-07-09
    • 2020-01-19
    • 2018-12-30
    • 2023-03-31
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多