Вы правы в том, что в документации говорится, что вы слушаете поток, чтобы он начал генерировать события. Однако потоки асинхронны, поэтому при вызове метода listen()
вы регистрируетесь для получения событий из потока в какой-то момент в будущем. Затем Дарт продолжит выполнение оставшейся части основной функции. Сразу после звонка listen()
вы звоните cancel()
, чтобы отменить подписку, поэтому ничего не печатается.
Если вы удалите или закомментируете отмену и запустите ее снова, вы увидите ожидаемый результат.
Слегка измененная версия вашего кода, мы надеемся, подсвечивает ход событий:
class Order {
String type;
Order(this.type);
}
class Pizza {}
void main() {
print("Main starts");
Order order = Order("pzza");
final StreamController sc = StreamController();
sc.sink.add(order);
sc.sink.add(order);
sc.sink.add(new Order("pizza"));
Stream st = sc.stream.map((order) {
return order.type;
}).map((orderType) {
if (orderType == "pizza")
return Pizza();
else
throw ("dude!, I don't know how to do that");
});
var sus = st.listen((pizza) {
print("We did a pizza");
}, onError: (error) {
print(error);
});
// sus.cancel();
sc.sink.add(new Order("pizza2"));
print("Main ends");
}
Запуск этого приводит к выводу:
Main starts
Main ends
dude!, I don't know how to do that
dude!, I don't know how to do that
We did a pizza
dude!, I don't know how to do that