Dart Stream's listen () не вызывает onDone


У меня есть поток с трансформатором, который соединяет 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(_));
}

Есть идеи, почему его никогда не вызывают?

1   4  

1 ответа:

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(_));
}
/**
   * Returns a future that handles the [onDone] and [onError] callbacks.
   *
   * This method *overwrites* the existing [onDone] and [onError] callbacks
   * with new ones that complete the returned future.
   *
   * In case of an error the subscription will automatically cancel (even
   * when it was listening with `cancelOnError` set to `false`).
   *
   * In case of a `done` event the future completes with the given
   * [futureValue].
   */
  Future asFuture([var futureValue]);

Возвращает будущее, которое обрабатывает обратные вызовы [onDone] и [onError].

Этот метод перезаписывает существующие [onDone] и [onError] обратные вызовы новыми, которые завершают возвращенное будущее.

Итак, ответ:

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("Not wait me, because 'asFuture' overwrites me");
      }).asFuture().catchError((_) => print(_))
      .whenComplete(() => stdout.write("done"));
}