我正在编写一个本机插件,在某些情况下,它必须调用应用程序Flutter 部分的函数,用Dart编写.

此外,从本机/平台部分向Dart/非本机部分调用方法的示例如下:

现在,如果平台只需要调用method(即该调用不返回任何/void),则此示例非常好,但是如果它需要调用function(即需要来自非本机/DART部分的返回值),我在Internet上找不到示例或文档.我相信它是可以实现的,因为在原生Java部分中,有一个方法:

public void invokeMethod(String method, Object arguments, MethodChannel.Result callback)

那么,有一个callback对象可能具有来自非本机部分的返回值-或者,我在这里搞错了,目前没有办法从应用程序的非本机DART部分返回值?

推荐答案

签名是void setMethodCallHandler(Future<dynamic> handler(MethodCall call)),所以我们需要在Dart端提供一个返回Future<dynamic>的函数,例如_channel.setMethodCallHandler(myUtilsHandler);

然后实现处理程序.这一个处理两个方法foobar,分别返回Stringdouble.

  Future<dynamic> myUtilsHandler(MethodCall methodCall) async {
    switch (methodCall.method) {
      case 'foo':
        return 'some string';
      case 'bar':
        return 123.0;
      default:
        throw MissingPluginException('notImplemented');
    }
  }

在Java端,返回值被传递给Result回调的success方法.

channel.invokeMethod("foo", arguments, new Result() {
  @Override
  public void success(Object o) {
    // this will be called with o = "some string"
  }

  @Override
  public void error(String s, String s1, Object o) {}

  @Override
  public void notImplemented() {}
});

在Swift中,返回值是传递给result闭包的Any?.(未实现由常量NSObjectFlutterMethodNotImplemented的任何参数发出信号.)

channel.invokeMethod("foo", arguments: args, result: {(r:Any?) -> () in
  // this will be called with r = "some string" (or FlutterMethodNotImplemented)
})

Flutter相关问答推荐

当MyChangeNotifier更改时如何计算函数,而无需在构建方法中进行不必要的调用- Flutter

如何在应用程序启动时解析和加载JSON文件?

CMakeLists.txt处的CMake错误:3(项目)找不到指定的Visual Studio实例

为什么Spotify Auth API返回400,而";code_verier不正确?

Flutter 块消费者仅对特定的状态属性更改做出react

应为标识符,并应为查找)错误

如何在flutter中使用youtube_explod_start加载下一页

如何在点击查看措辞下方添加句子?

ScaffoldMessenger 在等待键下方不起作用

Dart/Flutter 泛型:类型 '(SearchFilterItemModel) => String' 不是类型 '(SearchFilterItemModel) => String' 的子类型

在 Dart 中按土耳其语字母顺序对字符串进行排序

无法在 ListView (Flutter) 中限制 Card 的最大宽度

如何计算 Firestore 集合中的文档数量?

是否可以在 flutter 应用程序中使用 jetpack compose?

使用 Play Integrity API 时,Firebase 电话身份验证问题缺少客户端标识符错误

如何设置行中项目之间的空格相等?

Flutter - 定义按钮的优雅方式

为什么容器会填满整个空间?

如何使用 Navigator 2.0 导航到任何页面?

try 为两个下拉值添加共享首选项,但在 Flutter 上显示错误断言失败:?