【问题标题】:Dart Stream's listen() not calling onDoneDart Stream 的 listen() 没有调用 onDone
【发布时间】:2014-01-22 18:23:17
【问题描述】:

我有一个带有变压器的流,它将UTF8.decoder 融合到LineSplitter。它工作得很好,但从不调用onDone 参数中指定的函数。

import 'dart:async';
import 'dart:io';
import 'dart:convert';

void main(List<String> arguments) {

  Stream<List<int>> stream = new File("input.txt").openRead();

  stream.transform(UTF8.decoder.fuse(const LineSplitter()))
      .listen((line) {
        stdout.writeln(line);            
      }, onDone: () {
          stdout.write("done");
      }).asFuture().catchError((_) => print(_));
}

任何想法为什么它永远不会被调用?

【问题讨论】:

  • 我能重现但无法解释。
  • 我会等一天,看看是否有人有任何想法,然后提交错误/功能请求。
  • @GünterZöchbauer查看 mezoni 的答案。
  • asFuture () - 此方法用完成返回的未来的新回调覆盖现有的 onDone 和 onError 回调。 api.flutter.dev/flutter/dart-async/StreamSubscription/…

标签: dart dart-io


【解决方案1】:

问题是你使用了asFuture()方法。

如果你不使用它,onDone 将在到达 EOF 时正确调用;否则,您应该在Future 的返回值asFuture() 之后放置一个.then((_) =&gt; print('done')) 以获得相同的效果。

生成的代码应如下所示:

(stream
    .transform(utf8.decoder)
    .transform(LineSplitter())
    .listen((line) => print(line))
    .asFuture())
        .then((_) => print("done"))
        .catchError((err) => stderr.writeln(err));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 2019-01-11
    • 2021-12-20
    • 1970-01-01
    • 2020-12-26
    • 2016-11-01
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多