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仿知乎悬浮功能按钮FloatingActionButton效果
前段时间在看属性动画,恰巧这个按钮的效果可以用属性动画实现,下面通过本文给大家分享adroid仿知乎悬浮功能按钮FloatingActionButton效果,需要的朋友参考下吧2017-04-04Android TimePicker 直接输入的问题解决方案
这篇文章主要介绍了Android TimePicker 直接输入的问题解决方案的相关资料,需要的朋友可以参考下2017-04-04解决Android 6.0获取wifi Mac地址为02:00:00:00:00:00问题
这篇文章主要介绍了Android 6.0获取wifi Mac地址为02:00:00:00:00:00的解决方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下2017-11-11Android RecyclerView实现吸顶动态效果流程分析
RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)。接下来讲解RecyclerView的用法2022-12-12
最新评论