Я хочу испустить null
, если в моем потоке есть ошибка.
В приведенном ниже упрощенном примере у пользователя может не быть разрешения на доступ к документу, и в этом случае null
является подходящим событием потока для моего приложения.
Stream<String?> idOrNull() {
return FirebaseFirestore.instance
.doc('collection/doc')
.snapshots()
// ...if there's an error, I want to emit `null`
.map((DocumentSnapshot<Map<String, dynamic>> snap) {
return snap.id;
});
}
Читая документацию Поток: метод handleError, вы найдете этот менее чем полезный совет:
If you need to transform an error into a data event, use the more generic Stream.transform to handle the event by writing a data event to the output sink.
Глядя на Stream.transform, я все еще не понимаю, как выполнить эту задачу. Совет очень ценится.
StreamTransformer может получить доступ к приемнику потока при обработке ошибок, так что это работает:
Stream<String?> idOrNull() {
return FirebaseFirestore.instance
.doc('collection/doc')
.snapshots()
.transform(
StreamTransformer<DocumentSnapshot<Map<String, dynamic>>,
String?>.fromHandlers(
handleData: (snapshot, sink) {
sink.add(snapshot.id);
},
handleError: (error, stackTrace, sink) {
sink.add(null);
},
),
);
}