Dart 程序在没有执行最后一条语句的情况下退出

标签 dart stream

我正在尝试理解 Streams 并编写了一些代码。 一切似乎都正常,程序以状态代码 0 退出。但是它不会打印“loop done”和“main done”字符串。我不知道为什么。

import 'dart:async';

Stream<int> countStream(int to) async* {
      for (int i = 1; i <= to; i++) {
              yield i;
      }
}

class Retry {
    StreamController<int> _outgoing;

    Retry(Stream<int> incoming) {
        _outgoing = StreamController<int>();
        _outgoing.addStream(incoming);
    }

    Future<void> process() async {
        await for (final i in _outgoing.stream) {
            print("got $i");
        }
        print('loop done'); // Not printed
    }
}

void main() async {
  var stream = countStream(4);
  var retry = Retry(stream);
  await retry.process();
  print('main done'); // Not printed
}

最佳答案

_outgoing.stream 永远不会关闭,所以 await for 之后的代码永远不会执行。 VM 确实注意到该流上也不会有任何 事件,因此不会发生任何其他事情,并且它可以退出。您可以通过以下方式修复错误:

_outgoing.addStream(incoming).whenComplete(() {
    _outgoing.close();
});

关于Dart 程序在没有执行最后一条语句的情况下退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56169492/

相关文章:

c++ - 替换 o/istream bool 位移运算符

javascript - 套接字之间的双工管道似乎在 SMTP 的 NAT 后面中继 TLS,但只是有时

dart - Polymer Dart自定义元素未执行

flutter - 无法在 flutter 中更改按钮的高度

flutter - 如何转换 HH :MM:SS STRING format to an integer in minutes?

c# - 像写入文件一样写入流,但实际上写入对象

node.js - 为什么有些 Gulp 默认流 "flow",而有些则没有?

ffmpeg - 在ffmpeg中将RTSP流连续保存为特定长度(10分钟)的多个mp4文件

firebase - Flutter 和 Firestore 在请求中没有用户信息

flutter - 按钮onPressed不会运行该功能