在我的应用程序中,有一个社交页面,用户可以互相发送消息。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中进行可视化更新。
1条答案
按热度按时间odopli941#
你为什么写super.build(...);?你应该删除它。不需要,它可能会改变更新。