【问题标题】:How to pass functions as arguments from Dart/Flutter to Android native code?如何将函数作为参数从 Dart/Flutter 传递给 Android 本机代码?
【发布时间】:2019-06-19 07:09:07
【问题描述】:

我想创建一个可以从 Flutter 调用的基于 Java 的 SDK,Flutter 端需要通过提供回调来插入 SDK,以便在处理的不同阶段执行,理想情况下是这样的:

Future<Result> = doPayment(
  amount: 100.00, 
  currency: 'USD', 
  onPasscodeEntry: () => _renderInputBox(), 
  onValidation: () => _doValidation()
);

处理本身需要一些时间等等,所以Future&lt;PaymentResult&gt; 模式是有意义的,应用程序应该对处理的某些点做出反应,所以传入回调是有意义的。

问题:

  1. 如何将函数传递给 Java 代码? As far as I can tell all the Java-passable method arguments in Flutter are serializable-ish objects

  2. (不太重要/可选)如何返回 POJO 并在 Dart 中处理它?从the specs 判断,我应该(在Java 中)将结果编码为ArrayList/HashMapJSON 字符串,然后在Dart 中创建等效的构造函数以接收List/Map?这似乎有点笨拙,所以我问是否有更简单的方法,最好不维护同一对象的 Java 和 Dart 变体

【问题讨论】:

    标签: java android dart flutter


    【解决方案1】:

    你不能传递一个函数。

    您可以创建从函数名称到函数引用的映射,然后传递函数名称并在映射中按名称查找函数并调用它。

    你也不能通过 POJO。

    您需要将其序列化为 JSON(或其他一些受支持的格式)并在通道的另一端对其进行反序列化。为此,您需要使用 Dart 和 Java 实现 POJO 类。

    protobuf 或 flatbuffer 等包允许基于简化语言为不同语言生成代码以指定数据结构。

    【讨论】:

    • 我怀疑是这样的,但对于任何想要使用原生 SDK 的人来说,这真是太可惜了
    • 我认为这不会阻止您构建任何东西。有些事情变得有点麻烦。
    • 我不确定如何在没有闭包/匿名函数/类的情况下实现闭包,如果没有它,实现者无需担心 SDK 的内部工作流程会变成复杂的 SDK其中实现者需要了解关于 SDK 内部发生的各种事情,此时围绕它创建一个简单的 dart 应用程序变得不那么简单——实际上我必须为这个 Dart 应用程序制作一个单独的 SDK ,所以沿着 Kotlin 甚至纯 Java 路线走会更划算。很遗憾,我喜欢 Dart,我期待更高水平的集成。
    • 是的,有些事情会变得复杂。目前正在研究的github.com/flutter/flutter/issues/7053 将在某些使用 C 库而不是 Java 库的情况下有所帮助。
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2013-01-27
    • 1970-01-01
    相关资源
    最近更新 更多