web-dev-qa-db-fra.com

Flutter: Comment appeler des méthodes dans la partie Dart de l'application, à partir de la plate-forme native en utilisant MethodChannel?

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?

14
2beens

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 NSObjectFlutterMethodNotImplemented.)

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