如果你正在使用 Bloc 或 Provider 等状态管理库,你可能会遇到在 BLoC 自定义转换器和 switchMap 中的问题。这种情况通常发生在取消当前操作并替换为另一个操作时。BLoC 应该当前的 stream cancel(),并切换到新的 stream,但有时候可能会出现无效或错误的行为。
解决方法是使用 rxdart 库的新 StreamTransformer.fromHandlers。下面的代码示例演示了如何使用 StreamTransformer.fromHandlers 实现正确的自定义转换器和 switchMap 的行为:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
class SomeBloc {
final BehaviorSubject _count$ = BehaviorSubject.seeded(0);
Stream get count$ => _count$.stream;
final StreamTransformer _transformer = StreamTransformer.fromHandlers(
handleData: (event, sink) async {
if (event > 0) {
sink.add(2 * event);
} else {
sink.addError("Error: value can't be less than or equal to zero");
}
},
);
void loadData() {
Stream.periodic(
Duration(seconds: 1),
(i) => i + 1
)
.transform(_transformer)
.listen(
(data) => print('New data: $data'),
onError: (err) => print(err.toString()),
);
}
void dispose() {
_count$.close();
}
}
void main() {
SomeBloc bloc = SomeBloc();
bloc.loadData();
}
在上面的代码示例中,从流中获取数据并使用 transformer 表示。在 transformer 中我们决定什么样的 “事件” 应该发射,什么时候应该发射 “错误”,什么 “完成”。然后我们再将这个 transformer 应用到我们之前的流中。
这样使用 StreamTransformer.from