Flutter for OpenHarmony 实战 组件通信全解:从回调到事件总线

【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线

### 文章目录

  • [【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [@[toc]](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [前言](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [一、五种通信方式对比](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [1.1 通信方式总览](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [1.2 快速选择指南](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [二、回调函数通信](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [2.1 基础用法](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [2.2 类型安全的回调](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [三、Stream异步通信](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [3.1 基础用法](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [3.2 Stream的优势](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [3.3 Stream操作符](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [四、EventBus事件总线](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [4.1 简单的EventBus实现](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [4.2 定义事件](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [4.3 使用EventBus](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [4.4 EventBus使用场景](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [五、ValueNotifier轻量级通信](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [5.1 基础用法](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [5.2 ValueNotifier的优势](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [5.3 多个ValueNotifier管理](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [六、通信方式选择决策](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [6.1 场景对照表](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [6.2 混合使用实战](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [6.3 选择原则](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)
  • [总结](#文章目录 【Flutter for OpenHarmony 实战】Flutter组件通信全解:从回调到事件总线 @[toc] 前言 一、五种通信方式对比 1.1 通信方式总览 1.2 快速选择指南 二、回调函数通信 2.1 基础用法 2.2 类型安全的回调 三、Stream异步通信 3.1 基础用法 3.2 Stream的优势 3.3 Stream操作符 四、EventBus事件总线 4.1 简单的EventBus实现 4.2 定义事件 4.3 使用EventBus 4.4 EventBus使用场景 五、ValueNotifier轻量级通信 5.1 基础用法 5.2 ValueNotifier的优势 5.3 多个ValueNotifier管理 六、通信方式选择决策 6.1 场景对照表 6.2 混合使用实战 6.3 选择原则 总结)

前言

组件通信是Flutter开发中的核心话题。一开始我只会用回调函数,简单直接。但随着项目变复杂,发现有些场景回调函数不太好处理。

比如两个不相干的组件需要通信,或者一个事件需要通知多个组件,这时候回调函数就显得力不从心了。于是我开始学习其他通信方式。Stream处理异步数据很方便,EventBus可以解耦组件,ValueNotifier轻量又好用。

但问题又来了:这么多通信方式,什么时候用哪个?

这篇文章我想系统性地讲解Flutter中的各种组件通信方式,并提供选择指南,帮助你根据场景选择最合适的方案。


一、五种通信方式对比

1.1 通信方式总览

通信方式 适用场景 复杂度 性能 解耦程度
回调函数 父子简单通信
Stream 异步数据流
EventBus 跨层级/一对多
ValueNotifier 轻量状态
Provider/InheritedWidget 复杂全局状态

1.2 快速选择指南


二、回调函数通信

2.1 基础用法

回调函数是最简单的通信方式:

dart 复制代码
class ParentWidget extends StatefulWidget {
  @override
  State<ParentWidget> createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
  String _message = '等待操作...';

  void _handleCallback(String action) {
    setState(() {
      _message = '收到回调:$action';
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text(_message),
        ChildButton(
          label: '点击我',
          onPressed: () => _handleCallback('按钮被点击'),
        ),
      ],
    );
  }
}

class ChildButton extends StatelessWidget {
  final String label;
  final VoidCallback onPressed;

  const ChildButton({
    super.key,
    required this.label,
    required this.onPressed,
  });

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: Text(label),
    );
  }
}

2.2 类型安全的回调

dart 复制代码
// 定义回调类型
typedef ValueChanged<T> = void Function(T value);

class SliderWidget extends StatelessWidget {
  final ValueChanged<double> onChanged;

  const SliderWidget({super.key, required this.onChanged});

  @override
  Widget build(BuildContext context) {
    return Slider(
      value: 0.5,
      onChanged: onChanged,
    );
  }
}

使用场景

  • 父子组件通信
  • 简单的用户交互
  • 按钮点击、表单提交等直接操作

三、Stream异步通信

3.1 基础用法

Stream是Dart处理异步数据流的核心:

dart 复制代码
class StreamDemo extends StatefulWidget {
  @override
  State<StreamDemo> createState() => _StreamDemoState();
}

class _StreamDemoState extends State<StreamDemo> {
  final StreamController<String> _streamController =
      StreamController<String>.broadcast();
  final List<String> _logs = [];

  @override
  void dispose() {
    _streamController.close();
    super.dispose();
  }

  void _sendEvent(String event) {
    _streamController.add(event);
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        StreamBuilder<String>(
          stream: _streamController.stream,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              _logs.add(snapshot.data!);
            }
            return ListView.builder(
              itemCount: _logs.length,
              itemBuilder: (context, index) => Text(_logs[index]),
            );
          },
        ),
        ElevatedButton(
          onPressed: () => _sendEvent('新事件'),
          child: Text('发送事件'),
        ),
      ],
    );
  }
}

3.2 Stream的优势

特性 说明
多监听者 broadcast stream支持多个监听者
异步处理 天然支持异步操作
操作符 map、where、fold等丰富操作符
背压处理 自动处理数据流速

3.3 Stream操作符

dart 复制代码
stream
  .where((data) => data.isValid) // 过滤
  .map((data) => data.toJson()) // 转换
  .take(10) // 只取前10个
  .listen((result) => print(result));

使用场景

  • 异步数据流
  • 需要多个监听者
  • 复杂的数据转换

四、EventBus事件总线

4.1 简单的EventBus实现

dart 复制代码
class EventBus {
  final _controllers = <Type, StreamController>{};

  /// 发送事件
  void fire<T>(T event) {
    final controller = _controllers[T];
    if (controller != null) {
      controller.add(event);
    }
  }

  /// 订阅事件
  Stream<T> on<T>() {
    final type = T;
    if (!_controllers.containsKey(type)) {
      _controllers[type] = StreamController<T>.broadcast();
    }
    return _controllers[type]!.stream as Stream<T>;
  }

  /// 释放资源
  void dispose() {
    for (var controller in _controllers.values) {
      controller.close();
    }
    _controllers.clear();
  }
}

// 全局EventBus实例
final eventBus = EventBus();

4.2 定义事件

dart 复制代码
class LoginEvent {
  final String username;
  final DateTime timestamp;

  LoginEvent(this.username) : timestamp = DateTime.now();
}

class LogoutEvent {
  final DateTime timestamp;

  LogoutEvent() : timestamp = DateTime.now();
}

class DataUpdateEvent {
  final String dataType;
  final int count;

  DataUpdateEvent(this.dataType, this.count);
}

4.3 使用EventBus

dart 复制代码
class EventBusDemo extends StatefulWidget {
  @override
  State<EventBusDemo> createState() => _EventBusDemoState();
}

class _EventBusDemoState extends State<EventBusDemo> {
  StreamSubscription? _loginSubscription;
  StreamSubscription? _logoutSubscription;

  @override
  void initState() {
    super.initState();
    _subscribeToEvents();
  }

  void _subscribeToEvents() {
    _loginSubscription = eventBus.on<LoginEvent>().listen((event) {
      print('用户登录:${event.username}');
      setState(() {});
    });

    _logoutSubscription = eventBus.on<LogoutEvent>().listen((event) {
      print('用户退出');
      setState(() {});
    });
  }

  @override
  void dispose() {
    _loginSubscription?.cancel();
    _logoutSubscription?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ElevatedButton(
          onPressed: () => eventBus.fire(LoginEvent('张三')),
          child: Text('登录'),
        ),
        ElevatedButton(
          onPressed: () => eventBus.fire(LogoutEvent()),
          child: Text('退出'),
        ),
      ],
    );
  }
}

4.4 EventBus使用场景

适合用EventBus的场景

  • 跨层级通信(比如深层组件需要通知顶层)
  • 一对多通信(一个事件通知多个组件)
  • 解耦组件(组件之间不需要相互引用)

不适合用EventBus的场景

  • 简单的父子通信(用回调更直接)
  • 需要类型安全检查的场景

五、ValueNotifier轻量级通信

5.1 基础用法

ValueNotifier是Flutter内置的轻量级状态管理方案:

dart 复制代码
class ValueNotifierDemo extends StatefulWidget {
  @override
  State<ValueNotifierDemo> createState() => _ValueNotifierDemoState();
}

class _ValueNotifierDemoState extends State<ValueNotifierDemo> {
  final ValueNotifier<int> _counter = ValueNotifier<int>(0);

  @override
  void dispose() {
    _counter.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ValueListenableBuilder<int>(
          valueListenable: _counter,
          builder: (context, value, child) {
            return Text('计数:$value');
          },
        ),
        ElevatedButton(
          onPressed: () => _counter.value++,
          child: Text('增加'),
        ),
      ],
    );
  }
}

5.2 ValueNotifier的优势

  1. Flutter内置:不需要额外依赖
  2. 轻量级:比Provider简单,比InheritedWidget方便
  3. 性能好:只订阅的Widget会重建
  4. 使用简单:API简洁直观

使用场景

  • 计数器
  • 开关状态
  • 表单输入
  • 任何简单状态

5.3 多个ValueNotifier管理

dart 复制代码
class FormState {
  final username = ValueNotifier<String>('');
  final password = ValueNotifier<String>('');
  final isLoading = ValueNotifier<bool>(false);
  final errorMessage = ValueNotifier<String>('');

  void dispose() {
    username.dispose();
    password.dispose();
    isLoading.dispose();
    errorMessage.dispose();
  }
}

六、通信方式选择决策

6.1 场景对照表

场景 推荐方案 理由
父子简单通信 回调函数 最简单直接
异步数据流 Stream 天然支持异步
跨层级通信 EventBus 解耦组件
轻量状态 ValueNotifier 轻量高效
复杂全局状态 Provider/InheritedWidget 功能强大

6.2 混合使用实战

dart 复制代码
class PageDemo extends StatefulWidget {
  @override
  State<PageDemo> createState() => _PageDemoState();
}

class _PageDemoState extends State<PageDemo> {
  // 简单状态用ValueNotifier
  final _isLoading = ValueNotifier<bool>(false);

  // 异步操作用Stream
  final StreamController<String> _messageController =
      StreamController<String>.broadcast();

  // 跨页面事件用EventBus
  StreamSubscription? _eventSubscription;

  @override
  void initState() {
    super.initState();
    _eventSubscription = eventBus.on<AppEvent>().listen(_handleEvent);
  }

  void _handleEvent(AppEvent event) {
    // 处理全局事件
  }

  @override
  void dispose() {
    _isLoading.dispose();
    _messageController.close();
    _eventSubscription?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        // 回调函数处理导航
        leading: IconButton(
          icon: Icon(Icons.back),
          onPressed: () => Navigator.pop(context),
        ),
      ),
      body: Column(
        children: [
          ValueListenableBuilder<bool>(
            valueListenable: _isLoading,
            builder: (context, loading, child) {
              return loading ? CircularProgressIndicator() : Text('数据');
            },
          ),
        ],
      ),
    );
  }
}

6.3 选择原则

  1. 优先简单的方案:能回调就用回调
  2. 避免过度设计:不要为了用EventBus而用EventBus
  3. 注意生命周期:Stream和EventBus要记得释放
  4. 数据流要清晰:选择让代码更易读的方案

总结

Flutter提供了丰富的组件通信方式,每种都有其适用场景。

核心要点:

  1. 回调函数:简单直接的父子通信
  2. Stream:异步数据流和多个监听者
  3. EventBus:解耦的跨层级通信
  4. ValueNotifier:轻量级状态管理
  5. Provider/InheritedWidget:复杂全局状态

选择建议:

  • 优先简单的方案:能回调就用回调
  • 避免过度设计:不要为了用EventBus而用EventBus
  • 注意生命周期:Stream和EventBus要记得释放
  • 数据流要清晰:选择让代码更易读的方案

记住,没有最好的通信方式,只有最合适的。

欢迎加入开源鸿蒙跨平台社区:开源鸿蒙跨平台开发者社区

相关推荐
向哆哆11 小时前
Flutter × OpenHarmony 实战 | 打造画栈平台的顶部横幅组件
flutter·开源·鸿蒙·openharmony·开源鸿蒙
2501_9445255411 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 预算详情页面
android·开发语言·前端·javascript·flutter·ecmascript
雨季66611 小时前
Flutter 三端应用实战:OpenHarmony 简易“动态主题切换卡片”交互模式
flutter·ui·交互·dart
熊猫钓鱼>_>11 小时前
【开源鸿蒙跨平台开发先锋训练营】Day 19: 开源鸿蒙React Native动效体系构建与混合开发复盘
react native·华为·开源·harmonyos·鸿蒙·openharmony
To Be Clean Coder12 小时前
【Spring源码】createBean如何寻找构造器(二)——单参数构造器的场景
java·后端·spring
向哆哆12 小时前
构建健康档案管理快速入口:Flutter × OpenHarmony 跨端开发实战
flutter·开源·鸿蒙·openharmony·开源鸿蒙
2601_9495936512 小时前
基础入门 React Native 鸿蒙跨平台开发:BackHandler 返回键控制
react native·react.js·harmonyos
mocoding12 小时前
使用Flutter强大的图标库fl_chart优化鸿蒙版天气预报温度、降水量、湿度展示
flutter·华为·harmonyos
what丶k12 小时前
SpringBoot3 配置文件使用全解析:从基础到实战,解锁灵活配置新姿势
java·数据库·spring boot·spring·spring cloud
向哆哆12 小时前
构建智能健康档案管理与预约挂号系统:Flutter × OpenHarmony 跨端开发实践
flutter·开源·鸿蒙·openharmony·开源鸿蒙