BaseIO<T> constructor
BaseIO<T> ({})
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);
}
}
}
}