【问题标题】:How to transmit an error through async* in Dart?如何在 Dart 中通过 async* 传输错误?
【发布时间】:2019-07-12 09:16:57
【问题描述】:

在 Flutter 中,我们使用 StreamBuilder 接收一个 Stream e 给我们一个包含“数据”但也包含“错误”对象的 Snapshot 对象。

我想用 async* 创建一个产生数据的函数,但由于某些条件,它也会产生一些错误。我怎样才能在 Dart 中实现这一点?

Stream<int> justAFunction() async* {
  yield 0;

  for (var i = 1; i < 11; ++i) {
    await Future.delayed(millis(500));
    yield i;
  }

  yield AnyError(); <- I WANT TO YIELD THIS!
}

然后,在 StreamBuilder 中:

StreamBuilder(
            stream: justAFunction(),
            builder: (BuildContext context, AsyncSnapshot<RequestResult> snapshot) {
              return Center(child: Text("The error tha came: ${snapshot.error}")); <- THIS SHOULD BE THE AnyError ABOVE!
            },
          )

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    简单扔

    Stream<int> foo() async* {
      throw FormatException();
    }
    

    【讨论】:

    • 我正要回答自己,但你比我快……哈哈哈。谢谢雷米 :)
    • 这似乎可行,但调试器将其视为未处理的异常。很奇怪。
    • @Rémi Rousselet,当 StreamBuilder 中使用流并引发异常时,调试器会在 throw 行停止并将其视为未处理的异常,很奇怪。
    【解决方案2】:

    在工作示例下方:

    void main() {
      justAFunction().listen((i) => print(i), onError: (error) => print(error));
    }
    
    
    Stream<int> justAFunction() async* {
      yield 0;
    
      for (var i = 1; i < 3; ++i) {
        await Future.delayed(Duration(milliseconds:500));
        yield i;
      }
    
      yield* Stream.error('error is here'); <- Yield error!
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 2021-08-16
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多