From 310384f0e9b40d4b5197232d20f8d11ec0737c71 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Sun, 31 May 2026 16:23:18 -0400 Subject: [PATCH] Don't reverse the CustomScrollView Helps with scrolling jank, fixes #29 --- lib/controllers/room_chat_controller.dart | 13 +++---- lib/widgets/room_chat.dart | 41 ++++++++++++----------- 2 files changed, 25 insertions(+), 29 deletions(-) diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index d8fea0c..cf6209e 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -44,16 +44,11 @@ class RoomChatController extends AsyncNotifier> { loadOlder(); } - return IMap.fromValues( - keyMapper: (id) => 9999999 + (id ?? 0), - values: room.sticky, - ) - .addAll(room.timeline) - .toEntryIList(compare: (a, b) => (b?.key ?? 0).compareTo(a?.key ?? 0)) + return room.timeline + .toValueIList(sort: true, compare: (a, b) => (a ?? 0).compareTo(b ?? 0)) + .addAll(room.sticky) .map((entry) { - final foundEvent = entry.value == null - ? null - : room.events[entry.value!]; + final foundEvent = entry == null ? null : room.events[entry]; final editedEvent = foundEvent == null || foundEvent.lastEditRowId == 0 diff --git a/lib/widgets/room_chat.dart b/lib/widgets/room_chat.dart index 733c5ba..87bc90d 100644 --- a/lib/widgets/room_chat.dart +++ b/lib/widgets/room_chat.dart @@ -78,7 +78,10 @@ class RoomChat extends HookConsumerWidget { final client = ref.watch(ClientController.provider.notifier); final listController = useRef(ListController()); - final scrollController = useScrollController(); + final scrollController = useScrollController( + initialScrollOffset: 99999, + keys: [roomId], + ); useEffect(() { Future listener() async { @@ -90,9 +93,9 @@ class RoomChat extends HookConsumerWidget { if (room == null) return; if (scrollController.position.pixels == 0) { - await client.markRead(room); - } else { if (room.hasMore) await notifier.loadOlder(); + } else { + await client.markRead(room); } } @@ -323,7 +326,6 @@ class RoomChat extends HookConsumerWidget { } final controllerData = ref.watch(controllerProvider); - return Scaffold( appBar: RoomAppbar( roomId: roomId, @@ -345,12 +347,19 @@ class RoomChat extends HookConsumerWidget { child: switch (controllerData) { AsyncData(:final value) || AsyncLoading(:final value?) => CustomScrollView( - reverse: true, controller: scrollController, slivers: [ - SliverPadding( - padding: EdgeInsetsGeometry.only( - bottom: composerSize.value, + SliverToBoxAdapter( + child: Padding( + padding: EdgeInsets.symmetric(vertical: 36), + child: Center( + child: ElevatedButton( + onPressed: controllerData is AsyncLoading + ? null + : notifier.loadOlder, + child: Text("Load More"), + ), + ), ), ), @@ -359,7 +368,7 @@ class RoomChat extends HookConsumerWidget { itemCount: value.length, itemBuilder: (_, index) { final event = value[index]; - final previousEvent = value.getOrNull(index + 1); + final previousEvent = value.getOrNull(index - 1); return FlashWrapper( EventRenderer( event, @@ -401,17 +410,9 @@ class RoomChat extends HookConsumerWidget { }, ), - SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric(vertical: 36), - child: Center( - child: controllerData is AsyncLoading - ? Loading() - : ElevatedButton( - onPressed: notifier.loadOlder, - child: Text("Load More"), - ), - ), + SliverPadding( + padding: EdgeInsetsGeometry.only( + bottom: composerSize.value, ), ), ],