【发布时间】:2019-03-24 00:49:01
【问题描述】:
使用与flutter's firestore example类似的代码,假设快照文档中存储了一个引用字段,称为:document['userRef']。
首先,如何访问userRef的数据?使用document['userRef'].get().data 或document['userRef'].get().username 我无法访问数据。 (NoSuchMethodError: Class 'Future<DocumentSnapshot>' has no instance getter 'data')
我也尝试使用document['userRef'].get().then(...),但出现错误:type 'Future<dynamic>' is not a subtype of type 'String'
即使.then 可以工作,它不会为每条消息再次查找相同的引用吗?这里数据库是实时更新的,但不需要在 ListView 中对多条消息进行相同的查找。
class MessageList extends StatelessWidget {
MessageList({this.firestore});
final Firestore firestore;
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: firestore.collection('messages').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) return const Text('Loading...');
final int messageCount = snapshot.data.documents.length;
return ListView.builder(
itemCount: messageCount,
itemBuilder: (_, int index) {
final DocumentSnapshot document = snapshot.data.documents[index];
// document['userRef'] exists here
return ListTile(
title: Text(document['message'] ?? '<No message retrieved>'),
subtitle: Text('Message ${index + 1} of $messageCount'),
);
},
);
},
);
}
}
编辑: 我能够使用 FutureBuilder 获取嵌套数据,但不确定它的效率如何。 (这不会向 Firebase 发送大量冗余请求吗?)
为嵌套数据创建一个小部件,其中存在 document['userRef']:
FutureBuilder(
future: userData(document['userRef']),
builder: (BuildContext context,
AsyncSnapshot<dynamic> uData) {
return Text(uData.data['username']);
},
);
userData 函数如下所示:
Future<dynamic> userData(DocumentReference user) async {
DocumentSnapshot userRef = await user.get();
return userRef.data;
}
【问题讨论】:
标签: firebase dart flutter google-cloud-firestore