【发布时间】:2020-08-08 20:03:46
【问题描述】:
cloud_firestore 文档中的此示例使用 StreamBuilder 和 AsyncSnapshot 的 ConnectionState 来处理处于不同状态的流。当通过StreamProvider 而不是StreamBuilder 访问流时,是否有类似的方法来管理ConnectionState?什么是避免它在短时间内返回 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(),
);
}
},
);
}
}
我有一个相当基本的流:
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?
【问题讨论】:
标签: flutter dart google-cloud-firestore flutter-provider