最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter Recovering Stream Errors小技巧

 更新時間:2022年12月08日 14:52:15   作者:程序員界的小學生  
這篇文章主要為大家介紹了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)文章

最新評論

新沂市| 湘阴县| 泰安市| 德令哈市| 庐江县| 平定县| 汕尾市| 南乐县| 金沙县| 瑞金市| 延川县| 大安市| 江门市| 古蔺县| 东城区| 仙游县| 宣恩县| 中江县| 宜城市| 石棉县| 大方县| 临高县| 东平县| 巩义市| 牡丹江市| 龙江县| 兴隆县| 龙陵县| 定日县| 荆州市| 运城市| 武功县| 长垣县| 太原市| 莱州市| 吉木萨尔县| 武山县| 淳化县| 临漳县| 枣庄市| 铜川市|