0

由于这是一个颤振插件,我不希望依赖插件的开发人员无论如何都必须初始化插件。也许他们必须这样做,但我真的希望他们不必这样做。


_channel.setMethodCallHandler基本上,我想要一种在取决于插件的应用程序启动时自动 调用该方法的方法。其他开发人员不必这样做,例如调用DragndropPlugin类中的静态方法,他们自己来“初始化”插件。

也许有某种方式可以复制在 Java 平台特定方面完成的方式。这是一个被调用的方法的例子,我猜是在插件“加载”时以某种方式颤动:

public static void registerWith(Registrar registrar) {
    DragndropPlugin.methodChannel = new MethodChannel(registrar.messenger(), CHANNEL);
    DragndropPlugin.methodChannel.setMethodCallHandler(new DragndropPlugin());
}

具体来说,我说的是registerWith方法。


我尝试了以下方法,但这似乎不起作用。不是主要问题,但我希望能解释一下为什么这不起作用。或者就此而言,如果这应该起作用,我可能会犯下潜在的错误,使其不起作用。

abstract class DragndropPlugin {

  static const MethodChannel _channel =
      const MethodChannel(_CHANNEL);

  static void _handler = _channel.setMethodCallHandler(DragndropPlugin._onMethodCall);

  static Future<dynamic> _onMethodCall(MethodCall call) async {
    switch (call.method) {
      case "onDrag":
        print(call.arguments.toString());
        break;
      default:
        print("An unknown method was invoked on the platform-specific side.");
        break;
    }
  }
}


我的问题基本上是我将如何实现上述目标。


Flutter 1.9.1+hotfix.6 • 通道稳定 • https://github.com/flutter/flutter.git
框架• 修订版 68587a0916(6 周前) • 2019-09-13 19:46:58 -0700
引擎• 修订版b863200c37
工具• Dart 2.5.0

4

1 回答 1

0

大概,你会想要做比print(call.arguments.toString())你的方法处理程序更多的事情!您可能希望在插件用户的代码上调用一些回调。用户必须在某个时候向您的插件注册此回调,这就是您应该进行初始化的地方。

您的问题的前提是您不希望用户必须初始化插件,但他们需要在某个地方注册您将调用以响应 native-> Dart 方法调用的函数或接口。因此,这是一种相同的初始化方法!

这是一个典型插件的示例,SomePlugin它定义了一个抽象类SomePluginEvents,用户必须为其提供一个具体实例,以接收 native->Dart 方法/事件。

  static setEventHandler(SomePluginEvents handler) {
    if (handler == null || SomePlugin.handler != null) {
      throw Exception('cannot set event handler');
    }
    _channel.setMethodCallHandler(methodCallHandler);
    SomePlugin.handler = handler;
  }

为了回答您的附属观点,Dart 被设计为除非直接从main. _channel在第一次使用时被初始化,但由于没有人提到_handler它从未被初始化。Dart 中没有静态初始化(例如,与 Java 不同)。

于 2019-10-27T02:42:33.503 回答