首页 > 解决方案 > 如何更新列表中的小部件

问题描述

我有一个聊天列表,如果有用户尚未阅读的新消息,我想在每张聊天卡上显示。

该列表位于 StatefulWidget 中,该列表包含也是 StatefulWidgets 的重构卡,我还编写了代码以与 Firestore 一起检查用户是否已阅读消息,但我仍然不知道发生了什么,因为它没有t 更新未读消息的图标。

数据库中的数据发生变化,但聊天卡中没有。如果我重新加载应用程序,因为卡片被重建,那么它确实会改变。

这是聊天卡代码:

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
  }

如果需要更多信息,请告诉我!

==================================================== ======================= 编辑:

感谢@Pedro R 修复。

我只需要移动 SetState() 并检查已安装

void unreadMessagesVerifier() {
  _firestore.collection('chatRoom').document(_chatRoomID).get().then((data) async {
      if (mounted) {
        setState(() {
          hasUnreadMessages = data['hasUnreadMessages'];
        });
      }
  });
}

标签: fluttergoogle-cloud-firestore

解决方案


我认为您的问题在于您调用 setState 的方式。尝试在未来完成后调用它。像这样:

  void unreadMessagesVerifier() {
        _firestore.collection('chatRoom').document(_chatRoomID).get().then((data) =>
              data['hasUnreadMessages'].then(result){
                setState((){
                    hasUnreadMessages = result;
                });
              }); 
   }

顺便说一下格式化抱歉。


推荐阅读