Flutter: Как вызвать методы в части Dart приложения, с собственной платформы с помощью MethodChannel?

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

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

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

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

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

Ответы

Ответ 1

Подпись 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)
})

Ответ 2

Как я могу передать массив строк как объект, чтобы трепетать. я попробую

    Object obj = new String[] {"Hello","Bye"};
    channel.invokeMethod("foo",obj, new MethodChannel.Result(){
    ...
    );

Но это показывает мне ошибку => Неподдерживаемое значение: [Ljava.lang.String

Я задал вопрос в этой теме, но пока никто не ответил.