• flutter中如何定义EventChannel


    Flutter中,EventChannel是一种系统提供的用于从原生平台(iOS或Android)向Flutter发送事件流的机制。它与EventBus不同,EventBus通常是在Flutter Dart代码中用于不同组件或模块之间的通信的,而EventChannel是用于原生代码与Flutter Dart代码之间的通信。

    EventChannel在原生代码中用于发送流式数据到Flutter(例如传感器数据或任何原生事件)。与之对应的,Flutter Dart端可以监听这些事件并作出相应的处理。

    以下是一个EventChannel的基本定义和使用方法示例:

    步骤1: 在Flutter端定义EventChannel

    在Dart代码中,你需要定义一个EventChannel,并指定一个唯一的通道名:

    import 'package:flutter/services.dart';
    
    class NativeEvent {
      static const EventChannel _eventChannel = EventChannel('com.example.app/native_events');
    
      void startListening() {
        _eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);
      }
    
      void _onEvent(Object event) {
        // 处理从原生平台发送过来的事件
        print('Received event: $event');
      }
    
      void _onError(Object error) {
        // 处理监听过程中的错误
        print('Received error: $error');
      }
    }
    

    你可以在Flutter中的合适位置调用startListening()方法来开始监听事件。

    步骤2: 在原生端(Android)实现EventChannel

    在Android端,你需要使用EventChannel在Java/Kotlin代码中发送事件到Flutter:

    import io.flutter.plugin.common.EventChannel
    import io.flutter.plugin.common.PluginRegistry
    
    class NativeEventsPlugin : EventChannel.StreamHandler {
    
      companion object {
        @JvmStatic
        fun registerWith(registrar: PluginRegistry.Registrar) {
          val eventChannel = EventChannel(registrar.messenger(), "com.example.app/native_events")
          eventChannel.setStreamHandler(NativeEventsPlugin())
        }
      }
    
      // EventChannel.StreamHandler methods
      override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
        // 当Flutter开始监听时开始发送事件
        events?.success("Event from native")
        // 可以在这里设置更多逻辑来发送事件
      }
    
      override fun onCancel(arguments: Any?) {
        // 当Flutter取消监听时进行清理工作
      }
    }
    
    // 要在MainActivity中注册EventChannel:
    class MainActivity: FlutterActivity() {
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 其他逻辑
        NativeEventsPlugin.registerWith(registrarFor("com.example.app/native_events"))
      }
    }
    

    在iOS上的实现思路是类似的,你需要在Swift或Objective-C代码中进行相应的设置。

    原生事件流动态监听

    原生事件可能是动态的(例如,传感器数据或挑战响应等),所以当使用EventChannel时,你需要在原生代码中管理事件监听和传输逻辑。如何发送事件取决于你想要向Flutter传递什么类型的数据。

    注意,与MethodChannel不同(用于发送单次方法调用),EventChannel是用于发送事件流的。

    EventBus 和 EventChannel 的差异

    • EventBus 是在Flutter应用内部的Dart代码之间用于事件通知的工具,允许已注册的监听器响应特定事件。
    • EventChannel 是用于Flutter和原生代码之间通信的,特别是当原生代码需要向Flutter发送事件流时使用。
  • 相关阅读:
    基于MOOC的FPGA硬件类课程远程实验教学平台设计
    【标准化封装 SOT系列 】 D SOT-323 SOT-363
    声网,站在物联网的“土壤”里
    C++--哈希表--散列--冲突--哈希闭散列模拟实现
    为什么创建 Redis 集群时会自动错开主从节点?
    LabVIEW使用性能和内存信息
    JavaEE初阶 01 计算机是如何工作的
    自定义事件内容分发
    MySQL数据库中MHA高可用的搭建以及原理详解
    集成swagger 简单版
  • 原文地址:https://blog.csdn.net/Icarus_/article/details/139239059