Есть ли во флаттере способ автоматического вызова функции init в плагине при запуске приложения? - PullRequest
0 голосов
/ 26 октября 2019

Так как это плагин флаттера, я не хочу, чтобы разработчики, зависящие от плагина, в любом случае должны были инициировать плагин. Может быть, им придется, но я бы очень хотел, чтобы они этого не делали.


По сути, мне нужен способ автоматического вызова метода _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;
    }
  }
}


Мой вопрос в основном о том, как мне поступить в достижении вышеизложенного.


Флаттер 1.9.1 + исправление.6 • стабильный канал • https://github.com/flutter/flutter.git
Framework • ревизия 68587a0916 (6 недель назад) • 2019-09-13 19:46:58 -0700
Двигатель • Редакция b863200c37
Инструменты • Дротик 2.5.0

1 Ответ

0 голосов
/ 27 октября 2019

Предположительно, вы хотите сделать больше, чем 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).

...