我第一次在Flutter中开发一个项目,并试图找到组织Firestore DB的最佳方法。我相信我已经有了想要的方式,但无法弄清楚如何正确查询它。
我有一个ID属于集合的用户,该集合将玩家个人资料与其用户个人资料相关联(在单独的集合中)。
我需要:
我按这个顺序猜测。
DatabaseReference getCurrentUserRef() async {
return this.usersRef.child((await this.getCurrentUser()).uid);
}
var user = await getCurrentUserRef()
var _playerEvents = [];
db.collection('player').where('id', isEqualto: user).get().then((doc) => {
db.collection('player').doc(doc.data().id).collection('events').get().then((snapshot) => {
snapshot.forEach(doc) {
_playerEvents.push(doc.data().id);
}
});
});
然后使用该数组,我需要基于这些ID(如果有)获取所有事件
_playerEvents.forEach(event) {
db.collection('events').where('id', isEqualTo: event).get().then((doc) => {
//somehow popular a Map or JSON that I can show in a list view on the page for the events associated with that player
List_Item for display
});
}
这是我的数据库的一些屏幕。我正在学习使用飞镖的Flutter。任何帮助都将是惊人的。
答案 0 :(得分:0)
我对颤动不是很熟悉,所以我在代码方面帮不上忙。
但是要沿着正确的方向微调您:
Firestore是异步的。因此,要完成上述所有4个步骤,您需要使用回调。
我认为您不能以这种方式级联查询(如果它类似于Java,则不能这样做)。
您需要做的是在每个查询完成后引入回调,以便您有足够的信息来进行下一个查询。
答案 1 :(得分:0)
我实际上刚结束切换数据库,并查询了一个包含具有一定值的数组的集合。
Widget _buildTeamList() {
return Container(
child: Center(
child: StreamBuilder(
stream: Firestore.instance
.collection('teams')
.where("players", arrayContains: user['player_id'])
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) return const Text('Loading...');
return ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) =>
_buildTeamItem(context, snapshot.data.documents[index]),
);
}),
),
);
}
这真的很好。