如何在流内部产生firebase侦听器

时间:2018-03-20 23:18:13

标签: firebase firebase-realtime-database angular-dart

使用AngularDart和Firebase,以下代码不起作用,因为yield位于匿名内部类中。我怎么能改写这个?我是Angular和Dart的新手,但是找不到任何例子。

基本上我正在尝试在我的服务中侦听流中的项目,但是我从firebase获取了实际项目,需要将这些firebase项目传回流中。

在服务中:

Stream<Item> itemStream() async* {
  final ref = database().ref("items");
  await ref.onChildAdded.listen((e) {
    DataSnapshot snapshot = e.snapshot;
    Map parsedMap = snapshot.val();
    String id = snapshot.key;
    String property1 = parsedMap['property1'];
    String property2 = parsedMap['property2'];
    print(property1);
    print(property2);
    yield new Item(id, property1, property2); // invalid; yield does not work here.
  });
  // yield works here but it's no use here.
}

组件:

var stream = itemListService.itemStream();
await for (var item in stream) {
  print(item.id);
}

更新:我通过不使用服务解决了这个问题。但是我认为使用服务是更好的做法,这就是我想要这样做的原因。

1 个答案:

答案 0 :(得分:2)

你可以做两件事。

1)使用StreamController

2)(更好)

Stream<Item> itemStream() { final ref = database().ref("items"); return ref.onChildAdded.map((e) { DataSnapshot snapshot = e.snapshot; Map parsedMap = snapshot.val(); String id = snapshot.key; String property1 = parsedMap['property1']; String property2 = parsedMap['property2']; print(property1); print(property2); return new Item(id, property1, property2); }