You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter开发中Sink与Stream的核心区别是什么?

Sink与Stream的核心区别:Dart数据流的“入口”和“出口”

嘿,这个问题问到点子上了!在Dart的Stream体系里,Sink和Stream就是一套数据流的“输入端”和“输出端”,刚好对应你在Google I/O 2018里听到的概念,我给你拆解明白:

  • 角色定位:一个管进,一个管出

    • Sink是数据的唯一入口:你可以把它看成是一个“投递箱”,只能往里面塞数据(调用add()方法),或者发送错误信号、结束信号。它的职责只有一个——接收你要传递的内容,完全不用关心后续谁会处理这些数据。
    • Stream是数据的唯一出口:这是一个“接收站”,你只能从这里读取数据(通过listen()订阅),它会把Sink塞进来的内容按顺序推送给所有订阅者。它只负责输出数据,不关心数据是怎么产生的。
  • 使用场景:生产者vs消费者

    • 用Sink的时候,你是数据生产者:比如在Flutter里处理用户点击、表单输入,当有新的状态需要传递时,你只需要调用Sink.add()把数据扔进去,剩下的就不用管了。
    • 用Stream的时候,你是数据消费者:比如在UI层订阅这个Stream,一旦有新数据过来,就触发UI更新。你只需要等着接收数据,不用操心数据是怎么来的。
  • 绑定关系:成对出现,由StreamController串联
    通常它们是通过StreamController生成的一对搭档:你可以通过controller.sink拿到输入口,controller.stream拿到输出口。就像一根水管,Sink是进水口,Stream是出水口,中间的StreamController负责把数据从入口传递到出口,还能处理缓存、广播多订阅者这些逻辑。

举个极简的Flutter状态管理示例:

// 创建Stream控制器,同时获取Sink和Stream
final _controller = StreamController<int>();
final stateInput = _controller.sink;
final stateOutput = _controller.stream;

// 生产者:用户点击按钮时,往Sink里发送新状态
onPressed: () {
  stateInput.add(1);
}

// 消费者:订阅Stream,收到数据后更新UI
StreamBuilder<int>(
  stream: stateOutput,
  builder: (context, snapshot) {
    return Text("当前状态:${snapshot.data ?? 0}");
  },
)

这样是不是就一目了然了?它们的核心区别就是分工明确:一个负责“写”数据,一个负责“读”数据,通过这种解耦的方式,让Flutter的状态管理逻辑更清晰、更易维护。

内容的提问来源于stack exchange,提问作者Toni Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:55:23