Флаттер: Как вызывать методы в части приложения Dart, из родной платформы, используя MethodChannel? - PullRequest
0 голосов
/ 05 мая 2018

Я пишу собственный плагин, который в некоторых случаях должен вызывать функции в флаттерной части приложения, написанной на Dart. Как это достигается, объясняется здесь: https://flutter.io/platform-channels/

Кроме того, пример вызова метода из нативной / платформенной части в сторону Dart / не нативной: https://github.com/flutter/plugins/tree/master/packages/quick_actions

Теперь этот пример действительно хорош в том случае, если платформе нужно только вызвать method, то есть этот вызов ничего не возвращает / void, но в случае, если ей нужно вызвать function, т.е. требуется возвращаемое значение из не родной / дартс части я не смог найти пример или документацию в интернете. Я полагаю, что это может быть реализовано, хотя, потому что в нативной части Java есть метод:

public void invokeMethod (метод String, аргументы объекта, Обратный вызов MethodChannel.Result)

Итак, существует объект callback, который может иметь возвращаемое значение из не-нативной части - или, я здесь ошибаюсь, и в настоящее время нет способа вернуть значение из не-нативной части Dart приложение?

1 Ответ

0 голосов
/ 05 мая 2018

Подпись void setMethodCallHandler(Future<dynamic> handler(MethodCall call)), поэтому нам нужно предоставить функцию в конце Dart, которая возвращает Future<dynamic>, например _channel.setMethodCallHandler(myUtilsHandler);

Затем реализуйте обработчик. Этот обрабатывает два метода foo и bar, возвращая соответственно String и double.

  Future<dynamic> myUtilsHandler(MethodCall methodCall) async {
    switch (methodCall.method) {
      case 'foo':
        return 'some string';
      case 'bar':
        return 123.0;
      default:
        // todo - throw not implemented
    }
  }

В конце Java возвращаемое значение передается методу success обратного вызова Result.

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 возвращаемое значение представляет собой Any?, переданное закрытию result. (Не реализовано, сигнализируется любым параметром, являющимся постоянным NSObject значением FlutterMethodNotImplemented.)

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