flutter 如何从firestore数组中获取具有特定值的元素?

mznpcxlj  于 2023-04-07  发布在  Flutter
关注(0)|答案(1)|浏览(139)

我对Flutter和应用程序开发一般来说是新手。
我有一段代码可以使用streambuilder从firestore中获取文档,并希望使用该数据构建一个聊天磁贴。我发现自己在尝试获取聊天伙伴用户名时遇到了问题,因为我将其保存在数组中,并且两个用户都使用同一个文档。为了更好地了解,这里是我的firestore文档的屏幕截图:

为了解决这个问题,我将usersName的List<dynamic>从文档快照转换为List<String>,并调用另一个方法逐个检查每个元素的值,并返回与当前用户名不同的字符串。
代码运行良好,但我觉得有更好的方法来做到这一点。我会很感激,如果你能给予我建议更好的解决方案
下面是流构建器代码:

chatList() {
    return StreamBuilder(
      stream: chatRooms,
      builder: (context, snapshot) {
        return snapshot.hasData
          ? SingleChildScrollView(
            child: ListView.builder(
              itemCount: snapshot.data!.docs.length,
              shrinkWrap: true,
              itemBuilder: (context, index) {
                return ChatTile(
                  chatRoomId: snapshot.data.docs[index].data()["chatRoomId"], 
                  contactName: getContactName(List<String>
                      .from(snapshot.data.docs[index].data()['usersName'] as List))
                      .toString(),
                  recentMessageText: 'test', 
                  contactImagePath: '', 
                  recentMessageTime: 1680069876235, 
                  isRead: false);
              }),
          )
          : noChatHistory();
      }
    );
  }

下面是我用来查找聊天伙伴用户名的方法:

getContactName(List<String> nameList) {
  var targetUserName = StringBuffer();

  nameList.forEach((element) {
    if (element != currentUserName) {
      targetUserName.write(element);
    }
  });
    
  return targetUserName.toString();
}
vc6uscn9

vc6uscn91#

这完全取决于您的特定用例,但如果超过2个用户可以加入聊天室,那么我建议更改ChatRoom文档的模型。
usersusersName的单独属性不同,您可以使用一个属性,我将其称为参与者并使用以下结构:

"participants": {
  "b8ctqymu9gfDW5pnPu7pXQApWSp2": {
    "name": "Siti Ainun",
    "uid": "b8ctqymu9gfDW5pnPu7pXQApWSp2"
  },
  "655gEbHcGrVjKHLIh7iMt9Kadog2": {
    "name": "Tester Account 2",
    "uid": "655gEbHcGrVjKHLIh7iMt9Kadog2"
}

通过这种方式,您可以轻松地获取用户所属的所有会话,并通过过滤Map的值来获取会话中的其他用户。

相关问题