From 3c85786c1061e8c758b9598b97a595eab6ae6956 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Fri, 10 May 2024 16:32:14 +0200 Subject: [PATCH] refactor: Improve performance of chat list --- lib/pages/chat_list/chat_list_body.dart | 49 +++++++++---------------- lib/pages/chat_list/chat_list_item.dart | 6 +++ 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index 8d93febb..eeb6bb65 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -14,7 +14,6 @@ import 'package:fluffychat/pages/chat_list/status_msg_list.dart'; import 'package:fluffychat/pages/chat_list/utils/on_chat_tap.dart'; import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; -import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/public_room_bottom_sheet.dart'; @@ -43,7 +42,7 @@ class ChatListViewBody extends StatelessWidget { Theme.of(context).textTheme.bodyLarge!.color!.withAlpha(100); final subtitleColor = Theme.of(context).textTheme.bodyLarge!.color!.withAlpha(50); - + final filter = controller.searchController.text.toLowerCase(); return PageTransitionSwitcher( transitionBuilder: ( Widget child, @@ -239,35 +238,23 @@ class ChatListViewBody extends StatelessWidget { ), ), if (client.prevBatch != null) - SliverList( - delegate: SliverChildBuilderDelegate( - (BuildContext context, int i) { - if (!rooms[i] - .getLocalizedDisplayname( - MatrixLocals(L10n.of(context)!), - ) - .toLowerCase() - .contains( - controller.searchController.text.toLowerCase(), - )) { - return const SizedBox.shrink(); - } - final activeChat = controller.activeChat == rooms[i].id; - return ChatListItem( - rooms[i], - key: Key('chat_list_item_${rooms[i].id}'), - selected: - controller.selectedRoomIds.contains(rooms[i].id), - onTap: controller.selectMode == SelectMode.select - ? () => controller.toggleSelection(rooms[i].id) - : () => onChatTap(rooms[i], context), - onLongPress: () => - controller.toggleSelection(rooms[i].id), - activeChat: activeChat, - ); - }, - childCount: rooms.length, - ), + SliverList.builder( + itemCount: rooms.length, + itemBuilder: (BuildContext context, int i) { + return ChatListItem( + rooms[i], + key: Key('chat_list_item_${rooms[i].id}'), + filter: filter, + selected: + controller.selectedRoomIds.contains(rooms[i].id), + onTap: controller.selectMode == SelectMode.select + ? () => controller.toggleSelection(rooms[i].id) + : () => onChatTap(rooms[i], context), + onLongPress: () => + controller.toggleSelection(rooms[i].id), + activeChat: controller.activeChat == rooms[i].id, + ); + }, ), ], ), diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index 1f93b07e..024acc29 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -22,6 +22,7 @@ class ChatListItem extends StatelessWidget { final void Function()? onLongPress; final void Function()? onForget; final void Function() onTap; + final String? filter; const ChatListItem( this.room, { @@ -30,6 +31,7 @@ class ChatListItem extends StatelessWidget { required this.onTap, this.onLongPress, this.onForget, + this.filter, super.key, }); @@ -83,6 +85,10 @@ class ChatListItem extends StatelessWidget { final displayname = room.getLocalizedDisplayname( MatrixLocals(L10n.of(context)!), ); + final filter = this.filter; + if (filter != null && !displayname.toLowerCase().contains(filter)) { + return const SizedBox.shrink(); + } return Padding( padding: const EdgeInsets.symmetric( horizontal: 8,