主要概念
- sink:_StreamController中sink为_StreamSinkWrapper,_StreamSinkWrapper只是对_StreamController做一下包装
class _StreamSinkWrapper<T> implements StreamSink<T> {
final StreamController _target;
_StreamSinkWrapper(this._target);
void add(T data) {
_target.add(data);
}
void addError(Object error, [StackTrace? stackTrace]) {
_target.addError(error, stackTrace);
}
Future close() => _target.close();
Future addStream(Stream<T> source) => _target.addStream(source);
Future get done => _target.done;
}
stream : 提供listen接口,StreamSubscription的实际创建为stream调用StreamController的方法创建的
同步、异步:主要区别在于
Streamcontroller._sendData
方法中是调用了_subscription的_add方法还是_addPending(异步 microtask)方法
sink.add -> Streamcontroller.add->Streamcontroller._sendData->_subscription._add或_subscription._addPending(异步microtask)
单订阅、广播流:主要区别如下
- 在StreamController的_subscribe方法中,单订阅流_subscribe只能创建一次StreamSubscription,再次创建会报错。广播流的StreamController的_subscribe方法可以多次执行,并将创建的StreamSubscription以链表形式存储
- StreamController的_sendData方法中会遍历StreamSubscription执行_sendData或者_addPending方法