Начало потока из потока <Event>из базы данных Firebase в реальном времени Flutter - PullRequest
0 голосов
/ 24 февраля 2020

Я очень новичок, чтобы трепетать в Streams / Bloc / Provider, и я понимаю учебник, чтобы понять его. В тестовом уроке они используют Firestore, чтобы получить поток, подобный следующему:

Stream<List<Todo>> todos() {
    return todoCollection.snapshots().map((snapshot) {
      return snapshot.documents 
          .map((doc) => Todo.fromEntity(TodoEntity.fromSnapshot(doc)))
          .toList();
    });
  }

Где их снимок List<DocumentSnapshot>, мой из RTDB вместо Event. Я пытаюсь получить Stream<List<Object>> из узла RTDB, но из свойства .onValue() я получаю Stream<Event>. Внутри async map() я получаю доступ к событию snapshot, но не получаю доступа к Dart.core map(), как в примере, использующем Firestore, поскольку это не список. alerts() - это поток, который bloc будет слушать, но он ожидает Stream<List<Object>>, и я не могу его получить. Как мне go сопоставить его с Stream<List<Object>>, как мне нужно? Большое спасибо за ваше время и помощь. Мой код:

// 
static UserAlert fromSnapshot(DataSnapshot snapshot) {
    return UserAlert(
        city: snapshot.value['City'],
        country: snapshot.value['Country'],
        date: snapshot.value['Date'],
        description: snapshot.value['Description'],
        id: snapshot.value['Id'],
        latitude: snapshot.value['Latitude'],
        longitude: snapshot.value['Longitude'],
        region: snapshot.value['Region'],
        timestamp: snapshot.value['Timestamp'],
        alertImageName: snapshot.value['alertImageName'],
        imageUrl: snapshot.value['imageUrl'],
        user: snapshot.value['user']);
  }


// try 1
Stream<List<UserAlert>> alerts() {
    return _databaseReference.onValue.map((snapshot) {
      // do the mapping to a Stream<List<UserAlert>>
    });
  }

 // try 2
 Stream<List<UserAlert>> alerts() {
return _databaseReference.onValue.toList(){ // Function expressions can't be named error

};

}

 // try 3
 Stream<List<UserAlert>> alerts() {
return _databaseReference.onValue.map(
    (snapshot) => UserAlert.fromSnapshot(snapshot); // wrong return type
);

}

1 Ответ

1 голос
/ 24 февраля 2020

Использование StreamTransformer

Stream<UserAlert> alerts() {
  handleData(Event event, EventSink<UserAlert> sink) =>
      sink.add(UserAlert.fromSnapshot(event.snapshot.value));

  final transformer =
      StreamTransformer<Event, UserAlert>.fromHandlers(handleData: handleData);

  return _databaseReference.onValue.transform(transformer);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...