@@ -619,10 +619,39 @@ class MessageListView with ChangeNotifier, _MessageSequence {
619619    if  (haveOldest) return ;
620620    if  (busyFetchingMore) return ;
621621    assert (fetched);
622+     assert (messages.isNotEmpty);
623+     await  _fetchMore (
624+       anchor:  NumericAnchor (messages[0 ].id),
625+       numBefore:  kMessageListFetchBatchSize,
626+       numAfter:  0 ,
627+       processResult:  (result) {
628+         if  (result.messages.isNotEmpty
629+             &&  result.messages.last.id ==  messages[0 ].id) {
630+           // TODO(server-6): includeAnchor should make this impossible 
631+           result.messages.removeLast ();
632+         }
633+ 
634+         store.reconcileMessages (result.messages);
635+         store.recentSenders.handleMessages (result.messages); // TODO(#824) 
636+ 
637+         final  fetchedMessages =  _allMessagesVisible
638+           ?  result.messages // Avoid unnecessarily copying the list. 
639+           :  result.messages.where (_messageVisible);
640+ 
641+         _insertAllMessages (0 , fetchedMessages);
642+         _haveOldest =  result.foundOldest;
643+       });
644+   }
645+ 
646+   Future <void > _fetchMore ({
647+     required  Anchor  anchor,
648+     required  int  numBefore,
649+     required  int  numAfter,
650+     required  void  Function (GetMessagesResult ) processResult,
651+   }) async  {
622652    assert (narrow is !  TopicNarrow 
623653      // We only intend to send "with" in [fetchInitial]; see there. 
624654      ||  (narrow as  TopicNarrow ).with_ ==  null );
625-     assert (messages.isNotEmpty);
626655    _setStatus (FetchingStatus .fetchingMore, was:  FetchingStatus .idle);
627656    final  generation =  this .generation;
628657    bool  hasFetchError =  false ;
@@ -631,10 +660,10 @@ class MessageListView with ChangeNotifier, _MessageSequence {
631660      try  {
632661        result =  await  getMessages (store.connection,
633662          narrow:  narrow.apiEncode (),
634-           anchor:  NumericAnchor (messages[ 0 ].id) ,
663+           anchor:  anchor ,
635664          includeAnchor:  false ,
636-           numBefore:  kMessageListFetchBatchSize ,
637-           numAfter:  0 ,
665+           numBefore:  numBefore ,
666+           numAfter:  numAfter ,
638667          allowEmptyTopicName:  true ,
639668        );
640669      } catch  (e) {
@@ -643,21 +672,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
643672      }
644673      if  (this .generation >  generation) return ;
645674
646-       if  (result.messages.isNotEmpty
647-           &&  result.messages.last.id ==  messages[0 ].id) {
648-         // TODO(server-6): includeAnchor should make this impossible 
649-         result.messages.removeLast ();
650-       }
651- 
652-       store.reconcileMessages (result.messages);
653-       store.recentSenders.handleMessages (result.messages); // TODO(#824) 
654- 
655-       final  fetchedMessages =  _allMessagesVisible
656-         ?  result.messages // Avoid unnecessarily copying the list. 
657-         :  result.messages.where (_messageVisible);
658- 
659-       _insertAllMessages (0 , fetchedMessages);
660-       _haveOldest =  result.foundOldest;
675+       processResult (result);
661676    } finally  {
662677      if  (this .generation ==  generation) {
663678        if  (hasFetchError) {
0 commit comments