Flutter 如何更新列表中的小部件
我有一个聊天列表,如果有用户没有读到的新消息,我想在每个聊天卡上显示 列表在StatefulWidget中,列表包含重构的卡片,这些卡片也是StatefulWidget,我还编写了代码与Firestore一起检查用户是否阅读了消息,但我仍然不知道发生了什么,因为它不会更新未读消息的图标 数据库中的数据会更改,但聊天卡中不会更改。如果我重新加载应用程序,因为卡是重建的,那么它确实会改变 以下是聊天卡代码:Flutter 如何更新列表中的小部件,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我有一个聊天列表,如果有用户没有读到的新消息,我想在每个聊天卡上显示 列表在StatefulWidget中,列表包含重构的卡片,这些卡片也是StatefulWidget,我还编写了代码与Firestore一起检查用户是否阅读了消息,但我仍然不知道发生了什么,因为它不会更新未读消息的图标 数据库中的数据会更改,但聊天卡中不会更改。如果我重新加载应用程序,因为卡是重建的,那么它确实会改变 以下是聊天卡代码: bool hasUnreadMessages = false; void unreadM
bool hasUnreadMessages = false;
void unreadMessagesVerifier() {
setState(() {
_firestore.collection('chatRoom').document(_chatRoomID).get().then((data) async {
hasUnreadMessages = await data['hasUnreadMessages'];
});
});
}
@override
Widget build(BuildContext context) {
unreadMessagesVerifier();
return GestureDetector(
child: Stack(
children: <Widget>[
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Flexible(
child: Container(
width: double.infinity,
child: Text(
widget.lastMessage,
),
),
),
hasUnreadMessages
? Container(
margin: EdgeInsets.fromLTRB(10, 0, 5, 0),
child: CircleAvatar(
radius: 7,
backgroundColor: Colors.blue,
),
)
: SizedBox(),
],
),
),
],
),
onTap: widget.onTap,
); // ChatCard
}
我认为你的问题在于你如何称呼setState。 试着在未来结束后给它打电话。 像这样:
void unreadMessagesVerifier() {
_firestore.collection('chatRoom').document(_chatRoomID).get().then((data) =>
data['hasUnreadMessages'].then(result){
setState((){
hasUnreadMessages = result;
});
});
}
顺便说一下,很抱歉设置了格式。请考虑使用,它会根据更新的值重新构建它包装的特定小部件
因此,hasundermessage
将用于更新容器()。做这样的事
StatefulBuilder(
builder: (BuildContext context, StateSetter setState){
// here you return the data based upon your bool value
return hasUnreadMessages ? Container(
margin: EdgeInsets.fromLTRB(10, 0, 5, 0),
child: CircleAvatar(
radius: 7,
backgroundColor: Colors.blue,
)
) : SizedBox();
}
)
data['hasUnderMessages']。然后(结果){
there中的then给了我一个无法命名的错误函数表达式。你是对的,我在错误的位置调用了SetState()
。我将它改到了你的位置,忽略了重新格式化,它成功了!谢谢!
StatefulBuilder(
builder: (BuildContext context, StateSetter setState){
// here you return the data based upon your bool value
return hasUnreadMessages ? Container(
margin: EdgeInsets.fromLTRB(10, 0, 5, 0),
child: CircleAvatar(
radius: 7,
backgroundColor: Colors.blue,
)
) : SizedBox();
}
)