diff --git a/lib/model/message_list.dart b/lib/model/message_list.dart index 5da716c56a..8c1409a70f 100644 --- a/lib/model/message_list.dart +++ b/lib/model/message_list.dart @@ -487,7 +487,7 @@ class MessageListView with ChangeNotifier, _MessageSequence { // Anchor message ID is used to fetch messages from a specific point in the list. // It is set when the user navigates to a message list page with a specific anchor message. int? anchorMessageId; - int? get anchorIndex => anchorMessageId != null ? findItemWithMessageId(anchorMessageId!) : null; + int get anchorIndex => anchorMessageId != null ? findItemWithMessageId(anchorMessageId!) : 0; factory MessageListView.init( {required PerAccountStore store, required Narrow narrow, int? anchorMessageId}) { final view = MessageListView._(store: store, narrow: narrow, anchorMessageId: anchorMessageId); @@ -591,7 +591,9 @@ class MessageListView with ChangeNotifier, _MessageSequence { ? kMessageListFetchBatchSize ~/2 // Fetch messages before and after anchor : 0, // Don't fetch newer messages when no anchor ); - anchorMessageId ??= result.messages.last.id; + if(result.messages.isNotEmpty){ + anchorMessageId ??= result.messages.last.id; + } if (this.generation > generation) return; store.reconcileMessages(result.messages); diff --git a/lib/widgets/message_list.dart b/lib/widgets/message_list.dart index afb9f9f638..608f6b4901 100644 --- a/lib/widgets/message_list.dart +++ b/lib/widgets/message_list.dart @@ -483,8 +483,8 @@ class _MessageListState extends State with PerAccountStoreAwareStat model!.addListener(_modelChanged); await model!.fetchInitial(); setState(() { - oldItems = model!.items.sublist(0, model!.anchorIndex!+1); - newItems = model!.items.sublist(model!.anchorIndex!+1, model!.items.length); + oldItems = model!.items.sublist(0, model!.anchorIndex+1); + newItems = model!.items.sublist(model!.anchorIndex+1, model!.items.length); }); } @@ -498,8 +498,8 @@ class _MessageListState extends State with PerAccountStoreAwareStat final previousLength = oldItems.length + newItems.length; setState(() { - oldItems = model!.items.sublist(0, model!.anchorIndex!+1); - newItems = model!.items.sublist(model!.anchorIndex!+1, model!.items.length); + oldItems = model!.items.sublist(0, model!.anchorIndex+1); + newItems = model!.items.sublist(model!.anchorIndex+1, model!.items.length); // The actual state lives in the [MessageListView] model. // This method was called because that just changed. }); diff --git a/test/widgets/message_list_test.dart b/test/widgets/message_list_test.dart index c220dc0e0c..02ed19d667 100644 --- a/test/widgets/message_list_test.dart +++ b/test/widgets/message_list_test.dart @@ -366,7 +366,7 @@ void main() { await tester.tap(find.byType(ScrollToBottomButton)); await tester.pumpAndSettle(); check(isButtonVisible(tester)).equals(false); - check(scrollController.position.pixels).equals(0); + check(scrollController.position.maxScrollExtent - scrollController.position.pixels).isLessThan(36); }); }); @@ -720,6 +720,10 @@ void main() { final existingMessage = eg.streamMessage( stream: eg.stream(), topic: 'new topic', content: 'Existing message'); prepareGetMessageResponse([existingMessage, message]); + // Prepare response for fetchInitial after move + connection.prepare(json: eg.newestGetMessagesResult( + foundOldest: true, + messages: [existingMessage, message]).toJson()); handleMessageMoveEvent([message], 'new topic'); await tester.pump(const Duration(seconds: 1)); @@ -732,6 +736,10 @@ void main() { await setupMessageListPage(tester, narrow: narrow, messages: [message], streams: [channel]); prepareGetMessageResponse([message]); + // Prepare response for fetchInitial after move + connection.prepare(json: eg.newestGetMessagesResult( + foundOldest: true, + messages: [message]).toJson()); handleMessageMoveEvent([message], 'new topic'); await tester.pump(const Duration(seconds: 1));