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要记得释放
  • 数据流要清晰:选择让代码更易读的方案

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

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

相关推荐
2501_91592143几秒前
从构建到 IPA 保护,Flutter iOS 包如何做混淆与安全处理
android·安全·flutter·ios·小程序·uni-app·iphone
Chan16几秒前
双非 Java 后端首次实习 | 个人经验分享总结
java·开发语言·spring boot·spring·java-ee·intellij-idea
Trust yourself2432 分钟前
Flutter应用创建到打包需要注意的几个关键步骤
flutter
SoaringHeart8 分钟前
Flutter进阶|源码修改:给 DecorationImage 源码添加偏移量
前端·flutter
HalvmånEver9 小时前
7.高并发内存池大页内存申请释放以及使用定长内存池脱离new
java·spring boot·spring
深海呐9 小时前
鸿蒙 Video组件的基本使用(HarmonyOS-VideoView)
华为·harmonyos·harmonyos video·harmonyos 视频播放·harmonyos 播放器·harmonyos 播放视频
一直都在57210 小时前
Spring面经
java·后端·spring
xiaoye370810 小时前
如何在Spring中使用注解配置Bean的生命周期回调方法?
java·spring
闻哥10 小时前
深入Redis的RDB和AOF两种持久化方式以及AOF重写机制的分析
java·数据库·spring boot·redis·spring·缓存·面试
jgyzl10 小时前
2026.3.12 常见的缓存读写策略
java·后端·spring