【问题标题】:Can multiple binary messengers/ method channels send messages across the same channel name?多个二进制信使/方法通道可以通过相同的通道名称发送消息吗?
【发布时间】:2021-09-15 17:49:09
【问题描述】:

我正在尝试在 dart 隔离之间共享 MethodChannel,以便在两个隔离(例如,根隔离和我创建的新隔离)上调用平台端调用的 invokeMethod

例如,我们可以在两个隔离区以及平台/主机端实例化 MethodChannel(和关联的 BinaryMessenger)。

警告:二进制信使文档指出:

BinaryMessenger 预计将在其存在期间从单个线程中使用。

MethodChannel 的文档中:

通道的逻辑标识由其名称给出。名称相同的频道会干扰彼此的通信。

不幸的是,我的新隔离在发送消息时似乎没有到达平台:我收到No implementation found for method MethodName on channel com.example.app.package

【问题讨论】:

    标签: flutter-plugin


    【解决方案1】:

    是的,这些方法实际上被调用了。

    它正在工作。这是一个的想法,但实际的方法被调用了:dart 端的 2 个方法通道和平台端的 2 个方法通道相互调用很好。他们都有相同的频道名称。由于复杂性原因,可能不是一个好主意(见下文),但它确实有效。 ? 问题:

    • 只调用了 一个 方法调用处理程序。我在接收方创建了两个,但只调用了一个方法调用处理程序。不好。

    如果您的应用中有单独的组件(Android 组件:Activity、Service、Broadcast Receiver 或 Dart Isolates):

    • MethodChannel 使用唯一频道名称,以保持正常。如果您在不同的方法调用处理程序(应用中的组件)之间共享相同的通道名称,您将不得不停止使用 result.notImplemented,这是一种安全防护。
    • 如果您正在考虑 2 个方法通道,您最初可能还会考虑 0 或可选方法调用,其中平台当前没有该通道名称的有效方法通道。如果您还没有实例化,则会抛出错误:No implementation found for method $methodName on channel $name
      • 当您知道自己的方法通道在 Android 端尚未准备好(甚至未实例化)时,使用 try { /* ... */ } on MissingPluginException { /* ignore */ } 忽略异常。

    我的具体问题:

    我得到No implementation found for method MethodName 的原因正是因为我在飞镖端有两个 MethodChannel,在平台端有两个。我正在重新创建相同的隔离,因此我有 2 个 Flutter 应用程序同时运行。当一个 Isolate 在平台端的方法调用处理程序上调用我没有实现的 dart 方法时,我得到了这个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多