Flutter之StreamBuilder的原理

在上篇文章Flutter之Stream、StreamController的使用(二)中我们用StatelessWidget实现了UI更新的效果,这不经让人好奇:StatelessWidget不是无法重新构建吗?看代码发现,UI更新是StreamBuilder实现的,我们来探究下它的原理。 StreamBuilder 是 Flutter 中用于构建基于流 (Stream) 的部件树的一个 widget。它可以自动重新构建其 UI 任何时间流发出新的数据。要理解 StreamBuilder 的内部工作原理,我们可以探讨以下几个关键点:

1. StreamBuilder 和 Stream

Stream 是 Dart 中的一个核心部分,它用于接收异步事件序列,这些事件可以包括数据消息或错误。 StreamBuilder 则是一个 widget,它能够根据最新的 Stream 快照 (snapshot) 来重建自己。

2. 如何工作

a. 订阅 Stream 当你将一个 Stream 传递给 StreamBuilder,它开始 订阅 这个流。这意味着每当流发出一个新的值时,StreamBuilder 都会得到通知。

b. 构建新的 Widget 每当 Stream 发出一个新的值时,StreamBuilder 会调用其 builder 函数,该函数会根据新的值重建UI。传递给 builder 函数的 AsyncSnapshot 对象包含了流的当前快照,包括数据、错误和连接状态。

c. 更新 UI 一旦 builder 函数返回一个新的widget,StreamBuilder 将更新其 UI,显示新 widget。

d. 取消订阅 当 StreamBuilder 被 dispose 时(例如,当你切换页面时),它自动取消订阅 Stream,这防止了内存泄漏。

3. 示例使用

vbnet 复制代码
StreamBuilder<String>(
  stream: someStream,
  initialData: 'Initial Data',
  builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
    if (snapshot.hasError)
      return Text('Error: ${snapshot.error}');
    switch (snapshot.connectionState) {
      case ConnectionState.waiting:
        return Text('Loading...');
      default:
        return Text('Data: ${snapshot.data}');
    }
  },
)

4. 效率

由于只有当 Stream 发出新的值时 StreamBuilder 才重建,所以它相当效率高。 它避免了不必要的 UI 重建,只有当实际的数据改变时,与数据有关的 UI 部分才会被重建。 ###5. 常见问题 多次订阅的处理:如果 Stream 不支持多次订阅,当 StreamBuilder 重新构建并重新订阅流时可能会遇到问题。为此,多订阅(一对多,类似原生iOS里的通知)需要使用 BroadcastStream。

结论

StreamBuilder 提供了一种优雅的方式来动态更新 UI,同时避免了不必要的渲染,将异步操作与 UI 更新巧妙地结合在一起。了解其工作原理有助于你更加高效地利用它来构建响应式 UI。

相关推荐
程序人生8885 小时前
PDF 转 Word 版式错乱、表格丢失?DocConverter Web 格式互转引擎的保真实践
前端·人工智能·opencv·机器学习·pdf·word
粥里有勺糖6 小时前
安利一下最近用的桌面“Agent” | T3 Code
前端·github·ai编程
xy34536 小时前
Axure 9.0 动态面板基本操作
前端·ui·html·axure·原型·产品设计
不停喝水6 小时前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
一水鉴天7 小时前
统一对象拓扑(UOT)设计全链定稿:从三件事分离到三继承 之1 20261010(豆包“查看聊天内容”继续)
前端·css
栖凤7 小时前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
粥里有勺糖7 小时前
视野修炼第136期 | 前端小恐龙"Deno"被收购
前端·github·ai编程
修炼的dance7 小时前
页面塞了13.88 MB字体,导出的PDF只有71 KB
前端
长坡夜行7 小时前
复盘:一个 `continue` 让风控把 13% 持仓当成 0,自动触发了 -15.7% 假熔断
程序员
qq_369173637 小时前
如何将 AI 生成的 HTML 网页发布成在线链接?不用自己搭建服务器
前端·人工智能·html·效率工具·html 发布