我发现了一个令人困惑的DART Stream平等行为.

final streamController = StreamController<int>();

final stream1 = streamController.stream;
final stream2 = streamController.stream;

print(stream1 == stream2); // Prints true
print(identical(stream1, stream2)); // Prints false

如果stream2指的是stream1,则它的工作方式与预期相同:

final streamController = StreamController<int>();

final stream1 = streamController.stream;
final stream2 = stream1;

print(stream1 == stream2); // Prints true
print(identical(stream1, stream2)); // Prints true

这一切对StreamController<int>.broadcast()的人来说都是一样的.如何解释这种令人困惑的行为?

推荐答案

由于stream是一个getter,它可以每次返回相同的对象,但也可以为每次调用创建对象,如本例所示.让我们来看看dart/lib/async/stream_controller.dart个:

      // Return a new stream every time. The streams are equal, but not identical.
      Stream<T> get stream => _ControllerStream<T>(this);

comments 解释了这种令人困惑的行为.

同样的事情也会发生在dart/lib/async/broadcast_stream_controller.dart

      Stream<T> get stream => new _BroadcastStream<T>(this);

Dart相关问答推荐

观察对象的状态

空值判断运算符 - Flutter

切换到可靠的零安全后简单分配中的可空性不匹配

Dart,后面带感叹号的标识符

什么时候在 Dart 中使用interfaces接口?

Flutter Expansion Tile -- 标题 colored颜色 变化和尾随动画箭头 colored颜色 变化

执行 `dart2js` 时会生成哪些文件?为什么?

如何使用Flutter在按钮网格中滑动(swipe)/拖动(drag) 2 个或更多按钮

Flutter:[cloud_firestore/unknown] NoSuchMethodError:null 上的无效成员:'includeMetadataChanges'(Flutter Web)

如何在 Flutter 中渲染单个像素?

在 Dart 中将对象推入数组

Flutter插件和Flutter模块之间有什么区别?

判断Dart中是否提供了可选参数

如何从类中访问元数据注释?

Dart 语法高亮不是高亮 dart 代码

有可用的 Dart VM 吗?

用于 dartlang 的 REPL

我应该更喜欢迭代 Map.entries 还是 Map.values?

如何将 `ByteData` 实例写入 Dart 中的文件?

如何用 Dart 格式化日期?