【发布时间】:2020-08-25 00:07:18
【问题描述】:
在理解我应该如何使用 Firebase 时遇到一些问题,从逻辑和结构的意义上说。
我有一个目前看起来像这样的数据库:
在我用过的应用中:
StreamBuilder(
stream: Firestore.instance.collection('stores').snapshots(),
builder: (context, snapshot) {
<code here>
}
),
正如所有文档和指南所建议的那样。
但这会返回循环遍历我的所有文档,即我的所有用户 ID。我不希望这样,因为用户应该只看到他们自己的数据。但如果我尝试将其更改为:
stream: Firestore.instance.collection('stores').document(uid).snapshots(),
然后给出错误,因为您只能循环浏览文档集合,而不是集合文档。
然后因为这个设计根本不起作用,我想可能会在数据库中添加另一个多余的级别,使其像:
Collection:
- application name
Document:
- Stores
Collection:
- UID of user
Fields:
- Datafield1
- Datafield2
- Datafield3
- Datafield4
- etc etc etc
试图强迫它符合一些可用的东西。但它也不允许您在 Firebase 中执行此操作,因为它只会在文档中输入字段,而不是在集合中。
所以我的问题是,我如何使用这个产品来循环浏览只有一个用户的数据集?我相信这必须是对这一行的简单更改:
stream: Firestore.instance.collection('stores').snapshots(),
但我在网上找不到任何关于此的信息。
编辑:@SenpaiLeo
以前我是这样返回数据的:
return ListView.builder(
itemExtent: 500,
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) =>
_buildListRows(context, snapshot.data.documents[index]),
);
然后在 _buildListRows 中:
Widget _buildListRows(BuildContext context, DocumentSnapshot document) {
...
Container(
child: TextField(
controller: _storeNameController,
decoration: InputDecoration(
border: OutlineInputBorder(),
hintText: document['store_name'],
),
),
),
...
所以现在可能是我根据您的建议更改了参考,现在:
document['store_name']
是不是引用不正确?
【问题讨论】:
-
你在这里得到什么流:Firestore.instance.collection('stores').document(uid).snapshots(), ?
-
一个错误,指出“文档引用必须有偶数个段”,当我在线查找时,这意味着您根本无法在文档级别执行 snapshots(),您只能在集合级别执行此操作。
-
您也可以在文档级别进行快照。您能否确认您尝试查询的 uid 存在于 stores 集合中。
-
是的,它确实匹配,并且我设置了打印捕获,以在应用程序的各个阶段向我显示 UID,每次都是正确的。该应用程序还成功地从 Firebase 中提取数据,只是问题在于它提取了所有数据,而不是当前用户。
标签: firebase flutter dart google-cloud-firestore