返回
剖析StreamController源码(三)
前端
2023-11-29 00:16:59
SyncStreamController 源码解析
1. 定义与构造方法
class _SyncStreamController<T> implements StreamController<T> {
//省略构造方法
}
_SyncStreamController 是一个同步的 StreamController,它的构造方法如下:
SyncStreamController({
void onListen(),
void onPause(),
void onResume(),
voidonCancel(),
bool sync = false,
})
onListen
:当有订阅者订阅时,该回调函数会被调用。onPause
:当流被暂停时,该回调函数会被调用。onResume
:当流被恢复时,该回调函数会被调用。onCancel
:当流被取消时,该回调函数会被调用。sync
:指定是否为同步流。
2. 属性与方法
_SyncStreamController 具有如下属性和方法:
//省略属性
@override
Stream<T> get stream => _stream;
//省略方法
@override
void add(T value) {
//省略实现
}
//省略方法
@override
Future<void> addError(Object error, [StackTrace? stackTrace]) {
//省略实现
}
//省略方法
@override
Future<void> close() {
//省略实现
}
3. add 方法源码解析
@override
void add(T value) {
assert(!_isClosed);
if (!_hasListener) {
_pending.add(value);
return;
}
_add(value);
}
add
方法用于向流中添加数据。如果当前没有订阅者,则将数据添加到 _pending
列表中。如果当前有订阅者,则直接调用 _add
方法将数据添加到流中。
4. _add 方法源码解析
void _add(T value) {
if (_state == _StreamControllerState.closed) {
throw StateError('Stream is closed.');
} else if (_state == _StreamControllerState.paused) {
_addPending(value);
} else {
_addCurrentEvent(value);
}
}
_add
方法用于将数据添加到流中。如果流是关闭的,则抛出错误。如果流是暂停的,则将数据添加到 _pending
列表中。如果流是活动的,则将数据添加到当前事件中。
5. _addCurrentEvent 方法源码解析
void _addCurrentEvent(T value) {
final current = _currentEvent;
if (current == null) {
_currentEvent = _newEvent(value);
} else {
current._add(value);
}
}
_addCurrentEvent
方法用于将数据添加到当前事件中。如果当前没有事件,则创建一个新的事件并将其添加到当前事件中。如果当前有事件,则将数据添加到当前事件中。
6. _newEvent 方法源码解析
_StreamControllerEvent<T> _newEvent(T value) {
final record = new _StreamControllerRecord<T>(value);
return new _StreamControllerEvent<T>(record);
}
_newEvent
方法用于创建一个新的事件。它创建一个新的 _StreamControllerRecord
对象并将其包装在一个 _StreamControllerEvent
对象中。
至此,我们已经对 _SyncStreamController 的源码进行了详细的解析。通过了解其内部的运作机制,我们可以更好地理解 Flutter 中的异步事件处理。