native - Flutter: ¿Cómo llamar a los métodos en la parte Dart de la aplicación, desde la plataforma nativa usando MethodChannel?
platform (1)
La firma es
void setMethodCallHandler(Future<dynamic> handler(MethodCall call))
, por lo que necesitamos proporcionar una función en el extremo de Dart que devuelva
Future<dynamic>
, por ejemplo
_channel.setMethodCallHandler(myUtilsHandler);
Luego implementa el manejador.
Éste maneja dos métodos,
foo
y
bar
respectivamente,
String
y
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
}
}
Al final de Java, el valor de retorno se pasa al método de
success
de la devolución de llamada del
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() {}
});
Estoy escribiendo un plugin nativo que, en algunos casos, tiene que llamar a funciones en la parte del aleteo de la aplicación, escrita en Dart. Cómo se logra, se explica aquí: https://flutter.io/platform-channels/
Además, aquí hay un ejemplo de invocación de un método desde la parte nativa / plataforma hacia Dart / no nativo: https://github.com/flutter/plugins/tree/master/packages/quick_actions
Ahora, este ejemplo es realmente bueno en caso de que la plataforma solo necesite invocar un
method
, es decir, que la llamada no devuelva nada /
void
, pero en caso de que necesite invocar una
function
, es decir, necesite un valor de retorno de la parte no nativa / Dart. No pude haber encontrado un ejemplo o documentación en internet.
Sin embargo, creo que se puede implementar, porque en la parte nativa de Java hay un método:
public void invokeMethod (método de cadena, argumentos del objeto, devolución de llamada MethodChannel.Result)
Entonces, hay un objeto de
callback
que podría tener un valor de retorno de la parte no nativa o, ¿estoy equivocado aquí y actualmente no hay forma de devolver un valor de la parte de Dart no nativa de la aplicación?