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

Dart中StreamController.stream的==与identical结果不一致的原因探究

Dart Stream相等性表现的原因解析

先明确两个判断方法的本质

  • identical(a, b):严格校验是否为同一个内存对象实例,只有当a和b指向同一块内存地址时才返回true。
  • ==运算符:默认和identical行为一致,但很多类会重写它,用来判断逻辑意义上的相等,而非物理实例是否相同。

两次调用controller.stream的现象原因

StreamController的stream getter方法,每次被调用时都会创建并返回一个新的Stream包装对象(内部实现类如_StreamControllerStream):

  • 两次调用streamController.stream得到的stream1和stream2是不同的实例,内存地址不一样,因此identical(stream1, stream2)返回false。
  • 但这个包装类重写了==运算符,判断逻辑是:只要两个Stream对象关联的是同一个StreamController的底层数据流,就认为逻辑相等,所以stream1 == stream2返回true。

直接赋值的情况符合预期的原因

当把stream1直接赋值给stream2时,stream2只是stream1的引用,指向同一个实例,所以identical和==都会返回true,完全符合对象引用的常规逻辑。

广播流表现一致的原因

StreamController.broadcast()创建的广播控制器,其stream getter的实现逻辑和普通控制器完全相同:每次调用返回新的包装实例,但重写的==会校验是否关联同一个底层广播流,因此表现和普通流一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:11:06