【问题标题】:Passing data to Flutter based on Android event基于 Android 事件向 Flutter 传递数据
【发布时间】:2020-12-31 12:27:06
【问题描述】:

真的很难用正确的方法来实现以下目标。如果我想从我的 Flutter 应用程序对 Android 进行本机调用,我可以参考很多示例。例如:创建一个 EventChannel,然后监听事件并响应来自我的 Android/Kotlin onMessage 监听器的请求。

但是,我无法弄清楚如何走另一条路!我有一个在原生 Android 的后台触发的原生事件。当事件发生时,一切正常,我可以打印/调试数据,但我无法弄清楚将这些数据打包并发送回 Flutter 以在应用程序中显示的正确方法:

class MainActivity: FlutterActivity() {
....
....
....
fun somethingHappened(firstName: String, lastName: String, eMail: String) {
    Log.d("MyApp","An event has occurred...");
    // Log message is printing out correctly, but need to 
    // create Object / Hashmap / data structure and send to Flutter
}

....
....
}

谁能告诉我正确的模式/使用方法,最好是一个我可以参考的简单示例的链接?

谢谢, 刺拳

【问题讨论】:

  • api.flutter.dev/javadoc/io/flutter/plugin/common/… - 在这里您可以发出“正常”数据 - success(...) 或错误 -error(...)
  • @pskink,谢谢。我已经尝试基于使用 EventChannel.EventSink 的示例实现,但我显然没有正确执行,因为我看到的大多数示例都是使用 EventSink 来侦听 Android 中的消息并响应 Flutter。您是否有一个示例可以让我查看消息源自 Android 并发送到 Flutter 的位置?谢谢!
  • 不,您可以通过实现onListen - api.flutter.dev/javadoc/io/flutter/plugin/common/… 来聆听 - 该方法为您提供了我上面提到的接收器
  • 类似:EventChannel.StreamHandler handler = new EventChannel.StreamHandler() { @Override public void onListen(Object o, EventChannel.EventSink eventSink) { } @Override public void onCancel(Object o) { } }; FlutterView fv = getFlutterView(); new EventChannel(fv, "my.event.channel").setStreamHandler(handler);
  • 谢谢@pskink,你的 cmets 和 Develocodes 帮助我让它工作

标签: android-studio flutter kotlin dart


【解决方案1】:

MainActivity:

class MainActivity: FlutterActivity() {

    private val CHANNEL = "CHANNEL"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

       val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL);

        channel.invokeMethod("nameOfMethod", "dataToPass")

    }

}

在颤振方面:

MethodChannel channel = MethodChannel('CHANNEL');

  @override
  void initState() {
    
    channel.setMethodCallHandler((call){

      if(call.method == 'nameOfMethod'){
        print(call.arguments);
      }

      return null;
    });
    super.initState();
  }

【讨论】:

  • 非常感谢。这帮助了 1000%。我一定已经尝试了 100 种不同的方法,而且已经把事情复杂化了。我唯一需要做的就是将 Kotlin channel.invokeMethod 包装在 Handler(Looper.getMainLooper()).post {...} 中,否则我会遇到与在 UI 线程上执行相关的异常。希望这是正确的解决方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 2020-05-06
  • 2019-11-15
  • 2021-01-08
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多