我对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();
}
1条答案
按热度按时间vc6uscn91#
这完全取决于您的特定用例,但如果超过2个用户可以加入聊天室,那么我建议更改
ChatRoom
文档的模型。与
users
和usersName
的单独属性不同,您可以使用一个属性,我将其称为参与者并使用以下结构:通过这种方式,您可以轻松地获取用户所属的所有会话,并通过过滤Map的值来获取会话中的其他用户。