android - Flutter 原生插件 : Example with eventlisteners

标签 android ios plugins flutter

我正在寻找一个易于理解的带有 native 插件的事件监听器示例。因此,例如:我正在编写的插件有很多监听器,它们在操作失败或完成时执行某些操作。这些监听器可以用 native 代码编写,但我如何允许编写 dart 代码的最终用户编写他们自己的自定义监听器?那么例如在 onSuccess 事件中添加另一个变量赋值?

我正在寻找适用于 Android 和 iOS 的小示例。

---- 编辑 ----
我正在使用这段代码 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;

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());
    }
  });
}

我的onListenonCancel 方法仍然是空的。我想先设置geoQueryQueryReadyEventChannel。每当 GeoQueryEventListener 中的 onGeoQueryReady 接收到数据时,我都想通过此 channel 发送数据。我怎样才能做到这一点?我的主要问题是我不明白如何将 onListen 方法中的 GeoQueryEventListener 链接到本地​​ GeoQuery 实例。

最佳答案

不确定这是否有帮助,但我最近写了一个具有多个事件监听器的插件:https://github.com/apptreesoftware/pusher_flutter .当我写它时,我使用传感器插件作为指南:https://github.com/flutter/plugins/tree/master/packages/sensors

基础知识是为每个监听器创建一个 FlutterEventChannel 和另一个实现 FlutterStreamHandler 的类。

在我的示例中,我创建了 3 个 channel 及其 StreamHandler。我有一个用于监听错误的 channel ,一个用于连接更改,最后一个用于接收消息。每个 EventChannel 都有一个标识符。在我的 dart 代码中,我为我在 native 代码中创建的每个 FlutterEventChannel 创建了一个事件 channel 。

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

然后我使用 `receiveAsBroadcastStream 公开 API 是 Streams:

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

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

所以最终用户 API 是:

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

关于android - Flutter 原生插件 : Example with eventlisteners,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46263538/

相关文章:

wordpress - 我在哪里可以找到大量 WordPress 插件?

php - 如何在 WordPress 中选择具有特定标签/类别的帖子

android - 我们如何将动画/简单图像添加为视频的顶层并将其导出为 Android 中的单个视频?

java - 创建表时出现 Android SqLite 异常

ios - 暂停/播放其他应用程序的背景音频

iphone - 初学者 : Multiview app doesn't switch views correctly

java - SQLite 数据库没有被创建并且没有错误出现

android.widget.Switch - 开/关事件监听器?

ios - 可选类型 'UIImage?' 的值未展开

excel - 从我的插件自定义 Office(Word/Excel/PowerPoint)标准工具栏、功能区、菜单和上下文菜单