返回

剖析StreamController源码(三)

前端

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 中的异步事件处理。