Flutter 如何更新列表中的小部件

Flutter 如何更新列表中的小部件,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我有一个聊天列表,如果有用户没有读到的新消息,我想在每个聊天卡上显示 列表在StatefulWidget中,列表包含重构的卡片,这些卡片也是StatefulWidget,我还编写了代码与Firestore一起检查用户是否阅读了消息,但我仍然不知道发生了什么,因为它不会更新未读消息的图标 数据库中的数据会更改,但聊天卡中不会更改。如果我重新加载应用程序,因为卡是重建的,那么它确实会改变 以下是聊天卡代码: bool hasUnreadMessages = false; void unreadM

我有一个聊天列表,如果有用户没有读到的新消息,我想在每个聊天卡上显示

列表在StatefulWidget中,列表包含重构的卡片,这些卡片也是StatefulWidget,我还编写了代码与Firestore一起检查用户是否阅读了消息,但我仍然不知道发生了什么,因为它不会更新未读消息的图标

数据库中的数据会更改,但聊天卡中不会更改。如果我重新加载应用程序,因为卡是重建的,那么它确实会改变

以下是聊天卡代码:

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();
  }
)