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如何實現(xiàn)將數(shù)據(jù)庫保存到SD卡
有時候為了需要,會將數(shù)據(jù)庫保存到外部存儲或者SD卡中(對于這種情況可以通過加密數(shù)據(jù)來避免數(shù)據(jù)被破解),本文給大家分享Android如何實現(xiàn)將數(shù)據(jù)庫保存到SD卡,對android數(shù)據(jù)庫sd卡相關(guān)知識感興趣的朋友一起學習吧2015-12-12
Android應(yīng)用的多語言支持的實現(xiàn)方法
本篇文章主要介紹了Android應(yīng)用的多語言支持的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Android 中從屏幕左下角彈出Dialog動畫效果的實現(xiàn)代碼
這篇文章主要介紹了Android 中從屏幕左下角彈出Dialog動畫效果的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12
Android通過Java sdk的方式接入OpenCv的方法
這篇文章主要介紹了Android通過Java sdk的方式接入OpenCv的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
Android中Xposed框架篇---修改系統(tǒng)位置信息實現(xiàn)自身隱藏功能實例
本篇文章介紹了Android中Xposed框架的使用,詳細的介紹了修改系統(tǒng)位置信息實現(xiàn)自身隱藏功能實例,有需要的朋友可以了解一下。2016-11-11
Android繼承ViewGroup實現(xiàn)Scroll滑動效果的方法示例
這篇文章主要介紹了Android繼承ViewGroup實現(xiàn)Scroll滑動效果的方法,結(jié)合實例形式分析了Android滑動效果的原理及擴展ViewGroup實現(xiàn)滑動功能的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08

