Flutter Firebase 检索不同的用户数据

Posted

技术标签:

【中文标题】Flutter Firebase 检索不同的用户数据【英文标题】:Flutter Firebase Retrieve Different Users Data 【发布时间】:2022-01-18 05:52:59 【问题描述】:

我的 Firebase 表单是这样的;

用户

用户 1 ID

- Posts

用户 2 ID

- Posts

用户数量根据应用中的用户数量而变化。

我要做的是在我的主屏幕上显示我选择的用户的帖子。

所以首先我创建了一个这样的列表(我想显示他们的帖子的用户);

List<dynamic> userIDs = [
    "User1ID",
    "User2ID"
  ];

然后我尝试在 for 循环内的引用中使用列表中的这些元素,因为我试图显示多个用户的帖子。

这是 for 循环中的 CollectionReference;

final firestore = FirebaseFirestore.instance;

var userPostsRef;

for (int i = 0; i < userIDs.length; i++) 
      userPostsRef = userPostsRef.firestore.collection('users/$userIDs[i]/Posts');
    

但是没有用。

当我像这样使用 CollectionReference 时;

var userPostsRef = firestore.collection('users/$userIDs[0]/Posts');

它有效,但我不想显示单个用户的帖子,我想显示多个用户的帖子。

如何使用此方法或其他方法在我的主屏幕上显示多个用户的帖子?

添加了 StreamBuilder 部分;

StreamBuilder<QuerySnapshot>(
                      stream: userPostsRef,
                      builder:
                          (BuildContext context, AsyncSnapshot asyncsnapshot) 
                        if (asyncsnapshot.hasError) 
                          return Center(
                            child: Text("Error"),
                          );
                         else 
                          if (asyncsnapshot.hasData) 
                            List<DocumentSnapshot> listOfDocumentSnapshot =
                                asyncsnapshot.data.docs;
                            return ListView.builder(
                              physics: ScrollPhysics(),
                              shrinkWrap: true,
                              itemCount: listOfDocumentSnapshot.length,
                              itemBuilder: (BuildContext context, int index) 
                                return Padding(
                                  padding: const EdgeInsets.symmetric(
                                      horizontal: 12.0, vertical: 12.0),
                                  child: Container(
                                    child: Column(
                                      children: <Widget>[
                                        Stack(
                                          children: <Widget>[
                                            Align(
                                              alignment: Alignment.topCenter,
                                              child: ClipRRect(
                                                borderRadius:
                                                BorderRadius.circular(24),
                                                child: GestureDetector(
                                                  onTap: () => navigateToDetail(
                                                      listOfDocumentSnapshot[
                                                      index]),
                                                  child: Image(
                                                    height: 320,
                                                    width: 320,
                                                    fit: BoxFit.cover,
                                                    image: NetworkImage(
                                                        listOfDocumentSnapshot[
                                                        index]["photo"]),
                                                  ),
                                                ),
                                              ),
                                            ),
                                          ],
                                        ),
                                      ],
                                    ),
                                  ),
                                );
                              ,
                            );
                          
                           else 
                            return Center(
                              child: CircularProgressIndicator(
                                color: Colors.orangeAccent[400],
                              ),
                            );
                          
                        
                      ,
                    ),

【问题讨论】:

Firebase 实时数据库和 Cloud Firestore 是两个独立的数据库。请仅使用相关标签标记您的问题,不要同时使用两者。 我解决了我的问题,你可以从这个链接查看; https://***.com/questions/70407597/flutter-firebase-merge-streams-list-with-combinelateststream-and-display-on-stre/70433919#70433919 【参考方案1】:

无法从 UID 列表而不是其他 UID 列表中加载 Posts 子集合。

Firestore 支持的最接近的方法是从所有带有 collection group query 的 Posts 集合中加载,或者从特定路径下的所有 Posts 子集合中加载,此处显示的技巧 samthecodingman:CollectionGroupQuery but limit search to subcollections under a particular document

如果您无法更改数据模型以允许通过单个查询从相关子集合中获取数据,则必须执行多个查询并将结果合并到您的应用程序代码中。

【讨论】:

当我第一次申请时,作为一个收藏组,我可以拉出所有帖子并在屏幕上仅显示具有特定 ID 的帖子,这要归功于 whereIN 查询,但在测试中阶段,我看到 whereIN 查询只能查询 10 个值,所以应用程序最多只能显示 10 个帖子。由于这个问题,我开始寻找不同的解决方案。 总之,我想做的只是检索特定多个用户的数据。有没有办法在我当前的数据库表单或任何其他表单中做到这一点。 如果我需要改变我的数据库表单,你会建议我按照这个例子做什么? 最好的数据模型取决于您的应用程序,但如果您无法提出数据模型,您将不得不执行多个查询并将结果合并到您的应用程序代码中。 【参考方案2】:

你不能像这样使用查询集合引用

var userPostsRef = firestore.collection('users/$userIDs[0]/Posts');

我在应用中使用的技巧

如果你想加载用户 ID 下的所有帖子 我建议将future builder(帖子列表)包装在future builder(用户列表)下

另一种方法是使用您可以跟踪的内容设置用户 ID(我使用 firebase.auth.email 作为文档 ID 参考,因此查询会更容易)

或者您可以在应用程序启动时获取所有用户 ID 引用并将其放入内存变量中,这样您就可以减少冗余获取其余功能的用户 ID 引用(注意删除/更改用户等)

另一种方法是根据用户操作进行动态查询(这需要基于您的应用程序进行更多工作)

【讨论】:

我对检索特定的单个用户 ID 数据没有任何问题。例如我有 5 个用户; user1、user2、user3、user4、user5 我想检索 user2 和 user3 的帖子或 user3、user4、user5 的帖子,我可以检索单个用户的帖子,例如 user1 的帖子或 user4 的帖子。 总而言之,我要做的只是检索特定用户的数据。 这正是我对您获取用户列表然后在子列表中获取用户的所有属性的评论 简单的方法是在用户列表中使用未来的构建器进行包装,然后使其可扩展小部件,因此如果用户单击特定用户的获取属性 我在我的代码中添加了 StreamBuilder 部分。如果不难,能否通过代码解释一下你提到的例子?

以上是关于Flutter Firebase 检索不同的用户数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中从 Firebase 检索用户电子邮件

如何使用 Flutter 中的 UserID 从 Firebase Firestore 检索数据?

firebase 在聊天中检索数据时的进度指示器 - Flutter

Flutter Firebase异步查询未在流函数中检索数据

从 Firebase 检索所有活跃用户

使用 Firebase 可调用函数时如何检索用户的身份验证数据?