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
Я задал вопрос в этой теме, но пока никто не ответил.