首页 > 解决方案 > 在 FutureBuilder / StreamBuilder 中为文档 .doc('..') 分配动态未来值

问题描述

我是初学者,所以请原谅我一个琐碎的问题。我遇到了一个似乎很容易解决的问题。但是,在我理解这一点之前,我无法继续前进。

我有一个FutureBuilder这样的,效果很好:

FutureBuilder(
      future: FirebaseFirestore.instance
          .collection('accounts')
          .doc(familyId)
          .collection('users')
          .get(),
      builder: (context, usersSnapshot) {
        if (usersSnapshot.connectionState == ConnectionState.waiting) {
          return Center(
            child: CircularProgressIndicator(),
          );
        }
        final userDocs = usersSnapshot.data.docs;
        return GridView.builder(
          physics: AlwaysScrollableScrollPhysics(),
          itemCount: userDocs.length,
          primary: false,
          padding: const EdgeInsets.all(20),
          gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
            //maxCrossAxisExtent: 250,
            crossAxisCount: 2,
            crossAxisSpacing: 20,
            mainAxisSpacing: 5,
            childAspectRatio: 2,
          ),
          shrinkWrap: true,
          //reverse: true,
          itemBuilder: (ctx, index) => SingleUserFamily(
            userDocs[index].data()['userId'],
            userDocs[index].data()['username'],
            userDocs[index].data()['title'],
            userDocs[index].data()['userEmail'],
            userDocs[index].data()['imageUrl'],
            userDocs[index].data()['chosenOption'],
            //userDocs[index].data()['userId'] == user.uid,
            key: ValueKey(userDocs[index].id),
          ),
        );
      },
    )

如您所见,familyIdFirestore 流中有一个动态字符串。familyId我可以通过以下 Firestore 查询访问和读取此字符串 ( ),该查询有效:

  String familyId;
  FirebaseFirestore.instance
    .collection('accounts')
    .doc('family')
    .collection('users')
    .doc(user.uid)
    .get()
    .then((document) {
      familyId = document['familyId'];
      // I get proper result of print (I see Id string in debug console)
      print (familyId);
    });

不幸的是FutureBuilder,没有看到familyId它的“未来:”。

如何document['familyId']在流中使用上述查询的值FutureBuilder

非常感谢您挽救了我的生命!:)

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


如果不了解您使用的环境,这些类型的问题可能很难诊断。最好尽可能在本地进行测试,并查看部署过程中产生的任何错误日志。

有一些出色的工具可以在本地测试您的 Firebase 代码。如果您从本地 shell 以增量和交互方式对代码进行单元测试,您将快速发现任何问题。

您还可以在将代码投入生产之前使用Firebase 模拟器对代码进行原型设计、开发和测试。

虽然测试是开发工作流程不可或缺的一部分,但为调试和监控代码编写日志同样重要。您可以轻松创建自定义 Google Cloud Logs,以帮助确定问题的根本原因。

有不同的方法可以做到这一点,但下面的这些示例提供了一个基础。您可以在此处阅读有关Firebase 日志记录的更多信息。

const functions = require("firebase-functions");

functions.logger.log("Hello from info. Here's an object:", someObj);
const { warn } = require("firebase-functions/lib/logger");

// Attach structured data to the log as the last argument.
warn("This is a 'WARNING' severity message with some metadata.", {
  key1: 'val1',
  key2: 'val2'
});

index.js

exports.helloError = functions.https.onRequest((request, response) => {
  console.log('I am a log entry!');
  response.send('Hello World...');
});

推荐阅读