Flutter Listview.Builder不更新

wvyml7n5  于 2023-06-07  发布在  Flutter
关注(0)|答案(1)|浏览(155)

在我的应用程序中,有一个社交页面,用户可以互相发送消息。Listview.Builder正在呈现一个包含登录用户所有对话的列表。当用户在对话中收到一条不在列表顶部的消息时,我想将其移动到列表顶部,我通过调用reorderConversations函数来实现。

@override
  Widget build(BuildContext context) {
    super.build(context);
    if(data_retrieved) {
      cancel_loading_indicator();
    }
    return GestureDetector(
      onTap: () => FocusScope.of(context).unfocus(),
      child: Scaffold(
        body: returnRefreshIndicator(
            Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                returnScrollableListView(),
              ],
            ),
        ),
      ),
    );
  }

  // when a conversation gets a new message, this function places it at the top of the conversation list
  Future<void> reorderConversations() async {
    print("------ List Before Sorting ------");
    for(int i=0; i<conversations.length; i++) {
      print("Conversation id: ${conversations[i].getReceivingUser.getFullName}");
    }

    setState(() {
      conversations.sort((b, a) => a.getLatestMessageTimestampAsDatetime.compareTo(b.getLatestMessageTimestampAsDatetime));
    });

    print("------ List After Sorting -------");
    for(int i=0; i<conversations.length; i++) {
      print("Conversation id: ${conversations[i].getReceivingUser.getFullName}");
    }
  }

// builds and returns the scrollable view that will hold conversations for the user to view
  Widget returnScrollableListView() {
    return Expanded(
        child: returnScrollbar(
          scroll_controller,
          ListView.builder(
            controller: scroll_controller,
            keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
            physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
            itemCount: conversations.length, 
            shrinkWrap: true,
            padding: const EdgeInsets.only(top: 16),
            itemBuilder: (context, index) {
              return ConversationEntry(
                local_user: widget.local_user,
                local_conversation: conversations[index],
                reorder_conversations: reorderConversations,
              );
            },
          ),
        )
    );
  }

虽然该函数可以工作并重新排序会话对象,以便具有最新消息的会话对象位于顶部,但它不会在视觉上更新Listview.Builder。在下面的屏幕截图中,您可以看到Matthew Burns发送了一条新消息,尽管他仍然处于索引1而不是索引0:

在控制台日志中,您可以看到函数交换了条目:

如果我点击索引0中的Jack林肯对话,它会将我引导到与Matthew Burns的对话。因此,尽管列表的重新排序正在发生,但它并没有在listview.builder中进行可视化更新。

odopli94

odopli941#

你为什么写super.build(...);?你应该删除它。不需要,它可能会改变更新。

相关问题