【问题标题】:Flutter and Firebase: Basic structure issuesFlutter 和 Firebase:基本结构问题
【发布时间】: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


【解决方案1】:

如果你使用这个:

Collection:
  - Stores
     Document:
        - UID of user
         Collection:
            - Datafield1
            - Datafield2
            - Datafield3
            - Datafield4
            - etc etc etc

然后做:

Firestore.instance.collection('stores').document(uid).snapshots()

那么上面应该只获取uid文档中的数据,它不会获取子集合。如果要访问一个用户的子集合中的数据,请使用以下命令:

Firestore.instance.collection('stores').document(uid).collection('userStore').snapshots()

这将获取子集合userStore中的所有文档


解决方案:

child: StreamBuilder(
    stream: Firestore.instance.collection('stores').document(currentUserUID).snapshots(),
    builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
    if (snapshot.hasData) {
       return ListView.builder(
           shrinkWrap: true,
           itemCount: snapshot.data.data.length,
           itemBuilder: (context, index) =>
               _buildListRows(context, snapshot.data),
           );


Widget _buildListRows(BuildContext context, DocumentSnapshot document) {
return Container(
  height: MediaQuery.of(context).size.height * 0.8,
  child: ListView(
    children: <Widget>[
      Row(
        children: <Widget>[
          Padding(
            padding: EdgeInsets.fromLTRB(10, 0, 50, 0),
            child: Text(
              'Business Name',
              style: Theme
                  .of(context)
                  .textTheme
                  .body2,
            ),
          ),
          Container(
            height: 50,
            width: 200,
            padding: EdgeInsets.fromLTRB(5, 0, 5, 0),
            child: TextField(
              controller: _storeNameController,
              decoration: InputDecoration(
                border: OutlineInputBorder(),
                hintText: document['store_name'],
              ),
            ),
          ),
        ],
      ),

Firestore.instance.collection('stores').document(currentUserUID).snapshots() 将获取当前用户的文档,然后您可以通过 snapshot.data.data["location"] 访问它

【讨论】:

  • 谢谢彼得。我无法像您建议的那样设置数据库,因为它根本不允许这样做。在 Firebase 中,一旦您到达文档级别,下一部分就不是一个集合。我可能写错了,我会编辑它。它不允许集合中的数据字段,它只允许文档中的数据字段。我现在会更新这个问题,因为在尝试你的建议之前我没有意识到这一点。这比我想象的还要糟糕。
  • 在firebase中你有一个集合,在每个集合中你有文档,然后在每个文档中你可以有文档的子集合或数据
  • 如果您想获取 uid 文档的数据,请使用 document(uid) 获取。如果您在该文档中没有数据,那么您将一无所获。如果您想获取该文档下的子集合中的数据。然后你按照答案做。例如:子集合userData 将包含包含您可以检索的数据的文档。
  • 您也可以在文档上调用快照检查此stackoverflow.com/q/54479892/7015400 它用于 js,但应用于颤振
  • 当我在文档级别调用 .snapshots() 时,如下所示:stream: Firestore.instance.collection('stores').document(uid).snapshots(),我收到以下错误. “文档引用必须有偶数个段”。谷歌告诉我这是因为不可能做到这一点。
【解决方案2】:
Stream<QuerySnapshot> stream = Firestore.instance.collection('stores').where('uid', isEqualTo: uid).snapshots();

但我建议听快照更改,然后更新您需要的变量。

【讨论】:

  • 这让我有点不知所措!它至少不会产生任何错误,所以就是这样。但它不会在我的应用程序中返回任何数据。以前我得到的数据是......让我更新我的问题以正确回复你。
【解决方案3】:

(代表问题作者发布解决方案,以便将其移至答案空间)

这对我有用:

child: StreamBuilder(
    stream: Firestore.instance.collection('stores').document(currentUserUID).snapshots(),
    builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
    if (snapshot.hasData) {
       return ListView.builder(
           shrinkWrap: true,
           itemCount: snapshot.data.data.length,
           itemBuilder: (context, index) =>
               _buildListRows(context, snapshot.data),
           );


Widget _buildListRows(BuildContext context, DocumentSnapshot document) {
return Container(
  height: MediaQuery.of(context).size.height * 0.8,
  child: ListView(
    children: <Widget>[
      Row(
        children: <Widget>[
          Padding(
            padding: EdgeInsets.fromLTRB(10, 0, 50, 0),
            child: Text(
              'Business Name',
              style: Theme
                  .of(context)
                  .textTheme
                  .body2,
            ),
          ),
          Container(
            height: 50,
            width: 200,
            padding: EdgeInsets.fromLTRB(5, 0, 5, 0),
            child: TextField(
              controller: _storeNameController,
              decoration: InputDecoration(
                border: OutlineInputBorder(),
                hintText: document['store_name'],
              ),
            ),
          ),
        ],
      ),

再次感谢 Peter Haddad 在这方面所做的工作!

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 2023-02-10
    • 1970-01-01
    • 2019-01-27
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多