J'écris un plugin natif qui, dans certains cas, doit appeler des fonctions dans la partie flottante de l'application, écrite en Dart. Comment cela est réalisé, est expliqué ici: https://flutter.io/platform-channels/
De plus, un exemple d'invocation d'une méthode de la partie native/plateforme vers Dart/non-native est ici: https://github.com/flutter/plugins/tree/master/packages/quick_actions
Maintenant, cet exemple est vraiment sympa au cas où la plate-forme n'a besoin que d'appeler un method
, c'est-à-dire que l'appel ne renvoie rien/void
, mais au cas où il aurait besoin d'appeler un function
, c'est-à-dire qu'il a besoin d'une valeur de retour de la partie non native/Dart, je n'aurais pas pu trouver d'exemple ou de documentation sur Internet. Je pense que cela peut être implémenté, car dans la partie native Java part, il existe une méthode:
public void invokeMethod (méthode String, arguments Object, rappel MethodChannel.Result)
Donc, il y a un objet callback
qui pourrait avoir une valeur de retour de la partie non native - ou, je me trompe ici, et il n'y a actuellement aucun moyen de retourner une valeur de la partie Dart non native de l'application?
La signature est void setMethodCallHandler(Future<dynamic> handler(MethodCall call))
, nous devons donc fournir une fonction à la fin de Dart qui renvoie Future<dynamic>
, Par exemple _channel.setMethodCallHandler(myUtilsHandler);
Implémentez ensuite le gestionnaire. Celui-ci gère deux méthodes foo
et bar
retournant respectivement String
et 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
}
}
À la fin Java Java, la valeur de retour est transmise à la méthode success
du rappel 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() {}
});
Dans Swift, la valeur de retour est un Any?
Transmis à la fermeture result
. (Non implémenté est signalé par le paramètre any étant la valeur const NSObject
FlutterMethodNotImplemented
.)
channel.invokeMethod("foo", arguments: args, result: {(r:Any?) -> () in
// this will be called with r = "some string" (or FlutterMethodNotImplemented)
})