ios 如何从Flutter向Native传递消息?

lokaqttq  于 2022-12-24  发布在  iOS
关注(0)|答案(6)|浏览(136)

如果需要与特定API /硬件组件交互,您将如何将信息从Flutter传递回Android/原生代码?
是否有任何事件通道可以以其他方式发送信息或类似于回调的东西?

  1. platform_channel文档指出“方法调用也可以反向发送,平台充当Dart中实现的方法的客户端。quick_actions plugin就是一个具体的例子。”我不知道在这种情况下本机端是如何从Flutter接收消息的。
    1.看起来可以使用BasicMessageChannel的send()方法来发送“指定的消息到这个通道上的平台插件”,有谁能提供一个简单的实现示例吗?
tpgth1q7

tpgth1q71#

这是一个简单的实现,展示了:
1.将字符串Value从flutter传递到Android代码
1.从Android代码获取响应以进行Flutter
代码基于以下示例:https://flutter.io/platform-channels/#codec
1.传递字符串值“text”:

String text = "whatever";

Future<Null> _getBatteryLevel(text) async {
String batteryLevel;
try {
  final String result = await platform.invokeMethod('getBatteryLevel',{"text":text}); 
  batteryLevel = 'Battery level at $result % .';
} on PlatformException catch (e) {
  batteryLevel = "Failed to get battery level: '${e.message}'.";
}

setState(() {
  _batteryLevel = batteryLevel;
});

1.在RandomFunction()后返回响应“电池电量”;

public void onMethodCall(MethodCall call, MethodChannel.Result result) {
    if (call.method.equals("getBatteryLevel")) {

        text = call.argument("text");
        String batteryLevel = RandomFunction(text);

        if (batteryLevel != null) {
            result.success(batteryLevel);
        } else {
            result.error("UNAVAILABLE", "Battery level not available.", null);
        }
    } else {
        result.notImplemented();
    }
}
3bygqnnd

3bygqnnd2#

目标C

call.arguments[@"parameter"]

安卓

call.argument("parameter");
dgjrabp2

dgjrabp23#

是的,flutter确实有一个EventChannel类,这正是您要寻找的。
Here是一个示例,演示了如何实现MethodChannelEventChannelthis中等文章展示了如何在flutter中实现EventChannel
希望有帮助!

bwitn5fc

bwitn5fc4#

对于雨燕

guard let args = call.arguments as? [String : Any] else {return}
    let phoneNumber = args["contactNumber"] as! String
    let originalMessage = args["message"] as! String
qfe3c7zg

qfe3c7zg5#

从Flutter转换为本地:

await platform.invokeMethod('runModel', 
                           {'path': imagePath!.path} // 'path' is the key here to be passed to Native side
);

对于Android(Kotlin):

val hashMap = call.arguments as HashMap<*,*> //Get the arguments as a HashMap

val path = hashMap["path"] //Get the argument based on the key passed from Flutter

对于iOS(Swift):

guard let args = call.arguments as? [String : Any] else {return}
let text = args["path"] as! String
nlejzf6q

nlejzf6q6#

如果有人想用invoke方法将数据从native共享到flutter,请执行以下操作:
main.dart

Future<dynamic> handlePlatformChannelMethods() async {
  platform.setMethodCallHandler((methodCall) async {
   if (methodCall.method == "nativeToFlutter") {
     String text = methodCall.arguments;
     List<String> result = text.split(' ');
     String user = result[0];
     String message = result[1];
    }
   }
  }

MainActivity.java

nativeToFlutter(text1:String?,text2:String?){
 MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, 
  CHANNEL.invokeMethod("nativeToFlutter",text1+" "+text2);
 }

相关问题