Этот пример из документации cloud_firestore использует StreamBuilder
и ConnectionState
AsyncSnapshot
для обработки потока в его различных состояниях. Есть ли аналогичный способ управления ConnectionState
при доступе к потоку через StreamProvider
вместо StreamBuilder
? Каков наилучший способ избежать возврата в течение короткого времени null
до тех пор, пока он фактически не получит документы из Firestore?
Вот пример из документа cloud_firestore с StreamBuilder:
class BookList extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('books').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError)
return new Text('Error: ${snapshot.error}');
switch (snapshot.connectionState) {
case ConnectionState.waiting: return new Text('Loading...');
default:
return new ListView(
children: snapshot.data.documents.map((DocumentSnapshot document) {
return new ListTile(
title: new Text(document['title']),
subtitle: new Text(document['author']),
);
}).toList(),
);
}
},
);
}
}
У меня довольно простой c поток:
List<AuditMark> _auditMarksFromSnapshot(QuerySnapshot qs) {
return qs.documents.map((DocumentSnapshot ds) {
return AuditMark.fromSnapshot(ds);
}).toList();
}
Stream<List<AuditMark>> get auditMarks {
return Firestore.instance
.collection('_auditMarks')
.snapshots()
.map(_auditMarksFromSnapshot);
}
Доступ к нему осуществляется через StreamProvider
(здесь опущены другие провайдеры):
void main() async {
runApp(MultiProvider(
providers: [
StreamProvider<List<AuditMark>>(
create: (_) => DatabaseService().auditMarks, ),
],
child: MyApp(),
));
}
Я попытался каким-то образом преобразовать от QuerySnapshot
до AsyncSnapshot<QuerySnapshot>
, но, вероятно, ошиблись. Может, конечно, дать StreamProvider
некоторые initialData
примерно так - но это громоздко, подвержено ошибкам и, вероятно, дорого:
initialData: <AuditMark>[
AuditMark.fromSnapshot(await Firestore.instance
.collection('_auditMarks')
.orderBy('value')
.getDocuments()
.then((value) => value.documents.first))
... но я надеюсь, что есть более разумный способ управления состояние соединения и предотвращение возврата значения null до того, как он сможет отправлять документы?