如何将消息从 Flutter 传递到 Native?

Posted

技术标签:

【中文标题】如何将消息从 Flutter 传递到 Native?【英文标题】:How to pass a message from Flutter to Native? 【发布时间】:2018-08-12 10:56:29 【问题描述】:

如果需要与特定的 API/硬件组件交互,您将如何将信息从 Flutter 传递回 android/Native 代码?

是否有任何事件通道可以以其他方式或类似于回调的方式发送信息?

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

【问题讨论】:

【参考方案1】:

是的,flutter 确实有一个 EventChannel 类,这正是您正在寻找的。​​p>

Here 是一个演示如何实现MethodChannelEventChannel 的示例。和 this 中篇文章展示了如何在 Flutter 中实现 EventChannel

希望有所帮助!

【讨论】:

【参考方案2】:

这是一个简单的实现展示:

    将字符串值从颤振传递到 Android 代码 从 Android 代码中获取响应以进行颤动

代码基于来自: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;
);

2. RandomFunction() 后返回响应“batterylevel”;

 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();
                    
                

希望这会有所帮助!

【讨论】:

如何获取字符串列表 @Yeahia2508 你有答案吗? 我用其他方法解决了我的问题。 ***.com/questions/52456013/… @Yeahia2508 我已经找到了一个好的方法来做这件事。如果您仍然感兴趣,请告诉我 请在我的问题中添加您的答案。 @Gregga17【参考方案3】:

目标 C

call.arguments[@"parameter"]

安卓

call.argument("parameter");

【讨论】:

安卓呢? Android - Java ---> call.argument("parameter"); 在 kotlin 中怎么样 @HZan,在 Kotlin 中:val s: String? = call.argument("parameter")【参考方案4】:

快速

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

【讨论】:

【参考方案5】:

如果有人想通过调用方法将数据从本地共享到颤振 按照这个:

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);
 

【讨论】:

以上是关于如何将消息从 Flutter 传递到 Native?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 如何与 Native (Android) 进行交互 | 开发者说·DTalk

Flutter 如何与 Native (Android) 进行交互 | 开发者说·DTalk

React-Native - Firebase 云消息传递 - 如果从托盘打开则没有事件

8-9 Flutter与Native通信-Android端实战

Flutter:如何将变量从 StatelessWidget 传递到 StatefulWidget

将自定义数据从 Firebase 云消息传递控制台显示到 Flutter 应用程序?