BaseIO<T> constructor

BaseIO<T>({
  1. required T seedValue,
  2. required String semantics,
  3. bool sync = true,
  4. bool printLog = true,
  5. bool isBehavior = true,
  6. T onReset()?,
  7. PersistConfig<T>? persistConfig,
  8. bool skipError = false,
})

Implementation

BaseIO({
  /// 初始值, 传递给内部的[_subject]
  required T seedValue,

  /// Event代表的语义
  required String semantics,

  /// 是否同步发射数据, 传递给内部的[_subject]
  bool sync = true,

  /// 是否打印日志, 有些IO add比较频繁时, 影响日志观看
  bool printLog = true,

  /// 是否使用BehaviorSubject, 如果使用, 那么Event内部的[_subject]会保存最近一次的值
  bool isBehavior = true,

  /// 重置回调方法, 如果设置了, 则调用reset的时候会优先使用此回调的返回值
  T Function()? onReset,

  /// 是否持久化数据, 如果是持久化数据, 则数据变化时便会持久化, 且如果是BehaviorSubject
  /// 则下次构造时会发射上一次持久化的数据
  PersistConfig<T>? persistConfig,

  /// 直接略过错误, 不发射内容
  ///
  /// 在轮询场景有用
  bool skipError = false,
})  : _semantics = semantics,
      _seedValue = seedValue,
      _printLog = printLog,
      latest = seedValue,
      _onReset = onReset,
      _persistConfig = persistConfig,
      _skipError = skipError,
      _subject = isBehavior
          ? seedValue != null
              ? BehaviorSubject<T>.seeded(seedValue, sync: sync)
              : BehaviorSubject<T>(sync: sync)
          : PublishSubject<T>(sync: sync) {
  // 处理内存数据
  _subject.listen(_handleUpdateMemoryData);
  // 处理持久层数据
  if (_persistConfig != null) {
    final debounceTime = _persistConfig!.debounceDuration;
    Stream<T> stream = _subject.stream;
    if (debounceTime != null) {
      stream = _subject.debounceTime(debounceTime);
    }
    stream.listen(_handleUpdatePersistData);
  }

  // 如果是BehaviorSubject, 则检查是否有持久化下来的数据, 有则发射
  if (isBehavior) {
    if (_persistConfig != null) {
      try {
        final deserialized = gDecoratedStorage.get(_persistConfig!.key);
        // 只发射非空值
        if (deserialized == null) {
          L.w('读取到 [$_semantics] null缓存值, 直接略过');
          return;
        }

        final value = _persistConfig!.onDeserialize(deserialized);
        if (value != null) _subject.add(value);
      } catch (e, s) {
        L.w('读取持久层数据发生异常 $e, 删除key: [${_persistConfig!.key}]\n调用栈: $s');
        gDecoratedStorage.delete(_persistConfig!.key);
      }
    }
  }
}