Flutter Recovering Stream Errors小技巧
正文
你是否遇到過,出現(xiàn)異常的時候也需要給一個默認值,讓程序可以繼續(xù)運行下去?
一般的做法就是 一個達到try catch,然后在finally里面做一個處理。
今天我嘗試換一個思路,簡單的封裝一下
簡單封裝
首先定義一個stream轉(zhuǎn)換器,為了處理error handler。
如果onError不為空,就將出現(xiàn)錯誤添加到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來捕獲錯誤。如果出現(xiàn)錯誤,我們調(diào)用handler,如果我們得到一個返回值,就將他發(fā)送到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上面創(chuàng)建一個拓展,它允許我們輕松的使用我們的流轉(zhuǎn)換器
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 } }
最后來看一下結(jié)果:
這里面有一個小注意的地方,log()是我自己封裝的一個拓展
import 'dart:developer' as devtools show log; extension Log on Object { void log() => devtools.log(toString()); }
以上就是Flutter Recovering Stream Errors小技巧的詳細內(nèi)容,更多關(guān)于Flutter Recovering Stream Errors的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android仿知乎懸浮功能按鈕FloatingActionButton效果
前段時間在看屬性動畫,恰巧這個按鈕的效果可以用屬性動畫實現(xiàn),下面通過本文給大家分享adroid仿知乎懸浮功能按鈕FloatingActionButton效果,需要的朋友參考下吧2017-04-04Android的廣播Receiver動態(tài)注冊和靜態(tài)注冊示例
本篇文章主要介紹了Android的廣播Receiver動態(tài)注冊和靜態(tài)注冊示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Android TimePicker 直接輸入的問題解決方案
這篇文章主要介紹了Android TimePicker 直接輸入的問題解決方案的相關(guān)資料,需要的朋友可以參考下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實現(xiàn)吸頂動態(tài)效果流程分析
RecyclerView是Android一個更強大的控件,其不僅可以實現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。其可以實現(xiàn)數(shù)據(jù)縱向滾動,也可以實現(xiàn)橫向滾動(ListView做不到橫向滾動)。接下來講解RecyclerView的用法2022-12-12深入淺析Android手機衛(wèi)士保存密碼時進行md5加密
一般的手機沒有root權(quán)限,進不去data/data目錄,當手機刷機了后,擁有root權(quán)限,就可以進入data/data目錄,查看我們保存的密碼文件,因此我們需要對存入的密碼進行MD5加密,接下來通過本文給大家介紹Android手機衛(wèi)士保存密碼時進行md5加密,需要的朋友一起學習吧2016-04-04