Flutter Recovering Stream Errors小技巧

目录
  • 正文
  • 简单封装
    • override bind()
    • 测试一下

正文

你是否遇到过,出现异常的时候也需要给一个默认值,让程序可以继续运行下去?

一般的做法就是 一个达到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的资料请关注我们其它相关文章!

(0)

相关推荐

  • Flutter StreamBuilder实现局部刷新实例详解

    目录 前言 StreamBuilder 简介 StreamBuilder的实际应用 总结 前言 在flutter项目中,页面内直接调用setState方法会使得页面重新执行build方法,导致内部组件被全量刷新,造成不必要的性能消耗.出于性能和用户体验方面的考虑我们经常会使用局部刷新代替全量刷新进行页面更新的操作. 包括Provider.ValueNotifier和StatefulBuilder等在内的技术方案,都能够帮助我们实现Flutter局部刷新的需求.有兴趣了解StatefulBuild

  • Flutter Widget之NavigationBar使用详解

    目录 正文 background 正文 这是一个和时间一样古老的故事.您的应用程序有三到五个主要内容区域,您的用户应该能够在任何屏幕之间切换. 那么,在这种情况下,请查看NavigationBar. 现在,您可能会想,“底部们有导航栏吗?,这个新的导航栏小部件有什么特别之处?“ 不同之处在于BoottomNavigationBar使用Material 2设计系统,而NavigationBar具有新的Material 3外观和感觉. 例如,药丸形状,它以对比色指示活动的目的地. 要启动并运行,为N

  • Flutter Reusable Lottie Animations技巧

    目录 正文 封装相关加载数据使用的lottie动画 测试一下 正文 你是否想要在app里面新增一些炫酷的动画,但是呢?虽然Flutter提供了很多的动画,但是自己绘制吧,要么效果调整上过于耗费时间了,要么效果不尽人意. 专业的事情交给专业的人,如果动画是设计师提供并且能拿来使用,那就太好了!!! 曾经使用过gif,现在发现lottie动画,太香了- 封装相关加载数据使用的lottie动画 下面是我封装的有关加载数据使用的lottie动画 用关键值在枚举中定义动画,每个值都是磁盘上动画文件的名字.

  • Flutter StreamBuilder组件实现局部刷新示例讲解

    目录 一.前言 二.StreamBuilder 简介 三.StreamBuilder的实际应用 总结 一.前言 在flutter项目中,页面内直接调用setState方法会使得页面重新执行build方法,导致内部组件被全量刷新,造成不必要的性能消耗.出于性能和用户体验方面的考虑我们经常会使用局部刷新代替全量刷新进行页面更新的操作.包括Provider.ValueNotifier和StatefulBuilder等在内的技术方案,都能够帮助我们实现Flutter局部刷新的需求. 本文记录的是通过St

  • Presenting Streams in Flutter

    目录 如果我想要做一个组件,每秒更新时间, 最开始的想法就是使用StatefulWidget, 然后每秒调用一下setState方法刷新数据 能不能换成使用StatelessWidget呢? 可以的,不过用Stream来实现. 先创建一个AsyncSnapshot的拓展 extends PresentAsyncSnapshot<E> on AsyncSnapshot<E> { Widget present({ required BuildContext context, Widge

  • flutter中的布局和响应式app方法示例

    目录 flutter中的布局 (使用)放置一个组件 app 本身就是个组件 Material apps 和 Non-Material apps 自适应和响应式 flutter实现响应式的方法 小结 flutter中的布局 flutter布局机制的核心是组件.在flutter中,几乎所有的东西都是组件,布局模型也不例外.图片,Icon, 文本等等,我们在flutter客户端中看到的所有内容都是组件.我们看不到的东西,比如:rows,columns,等等等等也都是组件. 我们将简单的组件组合在一起,

  • 使用Flutter 构建Web应用逻辑解析

    目录 一.起源 二.渲染逻辑 三.打包处理 四.配置开发环境 测试应用 结束语 一.起源 Flutter 的起源就很有意思,大家都知道早期 Flutter 最先支持的平台是 Android 和 iOS,至今最核心的维护平台依然是 Android 和 iOS,但是事实上Flutter 来源于前端 Chrome 团队.另外前端的同学应该知道,Dart 起初也是为了 Web 而生,事实上 Dart 诞生至今也有 10 年了,所以可以说 Flutter 其实充满了 Web 的基因. 二.渲染逻辑 首先

  • Flutter Recovering Stream Errors小技巧

    目录 正文 简单封装 override bind() 测试一下 正文 你是否遇到过,出现异常的时候也需要给一个默认值,让程序可以继续运行下去? 一般的做法就是 一个达到try catch,然后在finally里面做一个处理. 今天我尝试换一个思路,简单的封装一下 简单封装 首先定义一个stream转换器,为了处理error handler. 如果onError不为空,就将出现错误添加到stream中 class StreamErrorHandle<T> extends StreamTransf

  • Java 8中 Stream小知识小技巧方法梳理

    目录 前言 只能遍历的一次 Stream 那么为什么流只能遍历一次呢? 流操作 中间操作 终端操作 前言 上篇只是简单的动手操作操作了流(stream),那 stream 到底是什么呢? 官方的简短定义:“从支持数据处理操作的源生成的元素序列” 分成三部分: 元素序列:你可以简单将它类比于一样,不过集合说的是数据的集合,而 stream 重点在于表达计算.如我们之前说到的 filter.map.sorted.limit等等 源:昨天我提到,如果了解过 Liunx 管道命令的朋友们,会知道,Liu

  • SafeList in Flutter and Dart小技巧

    目录 正文 封装一个SafeList 测试一下 正文 最近遇到一些列表的错误,例如,列表为空时直接调用方法会报错. 一般都会在使用前判断列表是否为空,再使用. 虽然Flutter提供了Null safety,但是用的时候还是会忘记或者忽略,直接使用'!'来跳过非空判断. 封装一个SafeList 代码如下: class SafeList<T> extends ListBase<T> { final List<T> _list; final T defaultValue;

  • JavaScript编程的10个实用小技巧

    在这篇文章中,我将列出10个Javascript实用小技巧,主要面向Javascript新手和中级开发者.希望每个读者都能至少从中学到一个有用的技巧. 1.变量转换 看起来很简单,但据我所看到的,使用构造函数,像Array()或者Number()来进行变量转换是常用的做法.始终使用原始数据类型(有时也称为字面量)来转换变量,这种没有任何额外的影响的做法反而效率更高. 复制代码 代码如下: var myVar   = "3.14159",str     = ""+ m

  • javascript 应用小技巧方法汇总

    javascript 在前端应用体验小技巧继续积累. 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x e

  • Pandas实现数据类型转换的一些小技巧汇总

    前言 Pandas是Python当中重要的数据分析工具,利用Pandas进行数据分析时,确保使用正确的数据类型是非常重要的,否则可能会导致一些不可预知的错误发生. Pandas 的数据类型:数据类型本质上是编程语言用来理解如何存储和操作数据的内部结构.例如,一个程序需要理解你可以将两个数字加起来,比如 5 + 10 得到 15.或者,如果是两个字符串,比如「cat」和「hat」,你可以将它们连接(加)起来得到「cathat」.尚学堂•百战程序员陈老师指出有关 Pandas 数据类型的一个可能令人

  • 处理JavaScript值为undefined的7个小技巧

    前言 我刚刚开始学习JavaScript时,大约是八年前,当时我对于undefined 和 null 比较困惑 ,因为他们都表示空值. 他们有什么明确的区别吗?他们似乎都可以定义一个空值,而且 当你进行 在做null ===undefined 的比较时,结果是true. 现在的大多数语言,像Ruby, Python or Java,他们有一个单独的空值(nil 或 null),这似乎才是一个合理的方式. 而在JavaScript里,当你要获取一个变量或对象(未初始化)的值时,js引擎会返回 un

  • JavaScript编码小技巧分享

    三元操作符 如果使用if...else语句,那么这是一个很好节省代码的方式. const x = 20; let big; if (x > 10) { big = true; } else { big = false; } //这样写... const big = x > 10 ? true : false; Short-circuit Evaluation 分配一个变量值到另一个变量的时候,你可能想要确保变量不是null.undefined或空.你可以写一个有多个if的条件语句或者Short

  • java实战小技巧之优雅的实现字符串拼接

    目录 前言 String底层原理 1. 普通写法 2. StringJoiner 3. guava joiner 4. 小结 总结 前言 字符串拼接不管是在业务上,还是写算法时都会频繁使用到. 相信没有小伙伴没有写过这样的代码,比如说现在让我们来实现一个字符串拼接的场景,怎样的实现才算是优雅的呢? 以将int数组转为英文逗号分隔的字符串为例进行演示 String底层原理 在讨论字符串拼接时,首先需要知道String的底层原理. 看下结构 private final byte[] value; 这

  • java实战小技巧之字符串与容器互转详解

    目录 前言 I. 字符串转列表 1. jdk支持方式 2. guava方式 3. apache-commons II. 列表转字符串 1. StringBuilder 2. String.join 3. gauva III. 小结 总结 前言 每天一个实战小技巧:字符串与Collection的互转 将字符串转换为List,这种业务场景可以说非常非常常见了,实现方式也比较简单 public List<String> str2list(String str, String split) { Str

随机推荐