2017-09-17 4 views
1

Je cherche un exemple facile à suivre d'eventlisteners avec des plugins natifs. Ainsi, par exemple: Le plugin que j'écris a beaucoup d'auditeurs qui font quelque chose quand une action échoue ou est terminée. Ces écouteurs peuvent être écrits en code natif, mais comment autoriser l'utilisateur final, qui écrit le code dart, à écrire ses propres écouteurs personnalisés? Par exemple, ajoutez une autre assignation de variable dans un événement onSuccess?Flutter native plugin: Exemple avec eventlisteners

Je cherche un petit exemple pour Android et iOS.

---- ---- EDIT
Je travaille avec ce code atm:

public static void registerWith(Registrar registrar) { 
    final MethodChannel methodChannelGeoFire = new MethodChannel(registrar.messenger(), "com.bram.vanbilsen.geofire.GeoFire"); 
    final MethodChannel methodChannelGeoQuery = new MethodChannel(registrar.messenger(), "com.bram.vanbilsen.geofire.GeoQuery"); 
    final EventChannel geoQueryKeyEnteredEventChannel = new EventChannel(registrar.messenger(), "com.bram.vanbilsen.geofire.keyEnteredChannel"); 
    final EventChannel geoQueryKeyExitedEventChannel = new EventChannel(registrar.messenger(), "com.bram.vanbilsen.geofire.keyExitedChannel"); 
    final EventChannel geoQueryKeyMovedEventChannel = new EventChannel(registrar.messenger(), "com.bram.vanbilsen.geofire.keyMovedChannel"); 
    final EventChannel geoQueryQueryReadyEventChannel = new EventChannel(registrar.messenger(), "com.bram.vanbilsen.geofire.queryReadyChannel"); 
    final EventChannel geoQueryQueryErrorEventChannel = new EventChannel(registrar.messenger(), "com.bram.vanbilsen.geofire.queryErrorChannel"); 
    final GeofirePlugin instance = new GeofirePlugin(registrar.activity()); 
    geoQueryKeyEnteredEventChannel.setStreamHandler(instance); 
    geoQueryKeyExitedEventChannel.setStreamHandler(instance); 
    geoQueryKeyMovedEventChannel.setStreamHandler(instance); 
    geoQueryQueryReadyEventChannel.setStreamHandler(instance); 
    geoQueryQueryErrorEventChannel.setStreamHandler(instance); 
    methodChannelGeoFire.setMethodCallHandler(instance); 
    methodChannelGeoQuery.setMethodCallHandler(instance); 
} 

GeofirePlugin(Activity activity) { 
    this.activity = activity; 
} 

private final Activity activity; 

Et

if (call.method.equals("addGeoQueryEventListener")) { 
    String refPath = call.argument("refPath"); 
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 
    GeoFire geofire = new GeoFire(ref); 
    List<Double> center = call.argument("center"); 
    double radius = call.argument("radius"); 
    GeoQuery query = geofire.queryAtLocation(new GeoLocation(center.get(0), center.get(1)), radius); 
    query.addGeoQueryEventListener(new GeoQueryEventListener() { 
    @Override 
    public void onKeyEntered(String key, GeoLocation location) { 
     System.out.println("entered"); 
    } 

    @Override 
    public void onKeyExited(String key) { 
     System.out.println("exited"); 
    } 

    @Override 
    public void onKeyMoved(String key, GeoLocation location) { 
     System.out.println("moved"); 
    } 

    @Override 
    public void onGeoQueryReady() { 

    } 

    @Override 
    public void onGeoQueryError(DatabaseError error) { 
     System.out.println(error.getMessage()); 
    } 
    }); 
} 

Mes onListen et onCancel méthodes sont encore vides. Je voudrais d'abord configurer geoQueryQueryReadyEventChannel. Je voudrais envoyer des données avec ce canal chaque fois que onGeoQueryReady dans le GeoQueryEventListener ramasse quelque chose. Comment puis-je atteindre cet objectif? Mon problème principal est que je ne comprends pas comment je peux lier le GeoQueryEventListener dans une méthode onListen à une instance locale GeoQuery.

Répondre

2

Je ne sais pas si cela aidera mais j'ai récemment écrit un plugin qui a plusieurs écouteurs d'événements: https://github.com/apptreesoftware/pusher_flutter. Quand je l'ai écrit, j'ai utilisé le plugin Sensor comme guide: https://github.com/flutter/plugins/tree/master/packages/sensors

Les bases sont pour chaque écouteur dont vous avez besoin pour créer un FlutterEventChannel et une autre classe qui implémente FlutterStreamHandler.

Dans mon exemple, je crée les 3 canaux et leurs StreamHandlers. J'ai un canal pour écouter les erreurs, un pour les changements de connectivité et le dernier pour recevoir des messages. Chaque EventChannel a un identifiant. Dans mon code Dart, je crée un canal d'événement pour chaque FlutterEventChannel que j'ai créé en code natif.

_connectivityEventChannel = 
     new EventChannel('plugins.apptreesoftware.com/pusher_connection'); 
_messageChannel = 
     new EventChannel('plugins.apptreesoftware.com/pusher_message'); 
_errorChannel = 
     new EventChannel('plugins.apptreesoftware.com/pusher_error'); 

Je puis que l'API expose est Streams en utilisant `receiveAsBroadcastStream:

Stream<PusherMessage> get onMessage => 
     _messageChannel.receiveBroadcastStream().map(_toPusherMessage); 

Stream<PusherError> get onError => 
     _errorChannel.receiveBroadcastStream().map(_toPusherError); 

Ainsi l'API utilisateurs est:

pusher.onMessage.listen((m) => doSomething(m)); 
pusher.onError.listen((e) => doSomethingWithError(m)); 
+0

Pourriez-vous mettre à jour le premier lien? Il est bas. Je pense que je comprends bien! Mais j'aimerais jeter un oeil à votre projet d'abord :) –

+0

Désolé, le lien a été corrigé. –

+0

Peut-être une question stupide mais est la chaîne dans le constructeur 'EventChannel' une chaîne choisie par vous qui est la même dans le code natif et le code dart? –