Flutter Recovering Stream Errors小技巧
正文
你是否遇到过,出现异常的时候也需要给一个默认值,让程序可以继续运行下去?
一般的做法就是 一个达到try catch,然后在finally里面做一个处理。
今天我尝试换一个思路,简单的封装一下
简单封装
首先定义一个stream转换器,为了处理error handler。
如果onError不为空,就将出现错误添加到stream中
class StreamErrorHandle<T> extends StreamTransformerBase<T, T> {
final _controller = StreamController<T>.broadcast();
final T? Function(Object error) onError;
StreamErrorHandler({
required this.onError,
});
@override
Stream<T> bind(Stream<T> stream) {
...
}
}
override bind()
用Stream里面的handleError来捕获错误。如果出现错误,我们调用handler,如果我们得到一个返回值,就将他发送到stream
@override
Stream<T> bind(Stream<T> stream) {
final sub = stream.handleError((error) {
final value = onError(error);
if (value != null) {
_controller.sink.add(value);
}
}).listen(_controller.sink.add);
_controller.onCancel = (){
sub.cancel();
};
return _controller.stream;
}
最后我们在Stream上面创建一个拓展,它允许我们轻松的使用我们的流转换器
extension Recover<T> on Stream<T> {
Stream<T> onErrorRecoverWith(T? Functioon(Object error) onError) => transform(StreamErrorHandle<T>(onError: onError));
}
测试一下
Stream<String> getNames() async* {
yield 'Foo'.
yield 'Bar';
throw Exception('Something went wrong');
}
Future<void> testIt() async {
final names = getNames().onErrorRecoverWith(
(error) {
error.log();
return 'Baz';
},
);
await for(final name in names){
name.log(); // Foo, Bar, Baz
}
}
最后来看一下结果:

这里面有一个小注意的地方,log()是我自己封装的一个拓展
import 'dart:developer' as devtools show log;
extension Log on Object {
void log() => devtools.log(toString());
}以上就是Flutter Recovering Stream Errors小技巧的详细内容,更多关于Flutter Recovering Stream Errors的资料请关注脚本之家其它相关文章!
相关文章
Android 中从屏幕左下角弹出Dialog动画效果的实现代码
这篇文章主要介绍了Android 中从屏幕左下角弹出Dialog动画效果的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下2016-12-12
Android通过Java sdk的方式接入OpenCv的方法
这篇文章主要介绍了Android通过Java sdk的方式接入OpenCv的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-04-04
Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能实例
本篇文章介绍了Android中Xposed框架的使用,详细的介绍了修改系统位置信息实现自身隐藏功能实例,有需要的朋友可以了解一下。2016-11-11
Android继承ViewGroup实现Scroll滑动效果的方法示例
这篇文章主要介绍了Android继承ViewGroup实现Scroll滑动效果的方法,结合实例形式分析了Android滑动效果的原理及扩展ViewGroup实现滑动功能的相关操作技巧,需要的朋友可以参考下2017-08-08


最新评论