7

我有一个带有变压器的流,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(_));
}

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

4

1 回答 1

1

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

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

生成的代码应如下所示:

(stream
    .transform(utf8.decoder)
    .transform(LineSplitter())
    .listen((line) => print(line))
    .asFuture())
        .then((_) => print("done"))
        .catchError((err) => stderr.writeln(err));
于 2021-11-13T08:13:24.157 回答