@@ -649,10 +649,39 @@ class MessageListView with ChangeNotifier, _MessageSequence {
649649    if  (haveOldest) return ;
650650    if  (busyFetchingMore) return ;
651651    assert (fetched);
652+     assert (messages.isNotEmpty);
653+     await  _fetchMore (
654+       anchor:  NumericAnchor (messages[0 ].id),
655+       numBefore:  kMessageListFetchBatchSize,
656+       numAfter:  0 ,
657+       processResult:  (result) {
658+         if  (result.messages.isNotEmpty
659+             &&  result.messages.last.id ==  messages[0 ].id) {
660+           // TODO(server-6): includeAnchor should make this impossible 
661+           result.messages.removeLast ();
662+         }
663+ 
664+         store.reconcileMessages (result.messages);
665+         store.recentSenders.handleMessages (result.messages); // TODO(#824) 
666+ 
667+         final  fetchedMessages =  _allMessagesVisible
668+           ?  result.messages // Avoid unnecessarily copying the list. 
669+           :  result.messages.where (_messageVisible);
670+ 
671+         _insertAllMessages (0 , fetchedMessages);
672+         _haveOldest =  result.foundOldest;
673+       });
674+   }
675+ 
676+   Future <void > _fetchMore ({
677+     required  Anchor  anchor,
678+     required  int  numBefore,
679+     required  int  numAfter,
680+     required  void  Function (GetMessagesResult ) processResult,
681+   }) async  {
652682    assert (narrow is !  TopicNarrow 
653683      // We only intend to send "with" in [fetchInitial]; see there. 
654684      ||  (narrow as  TopicNarrow ).with_ ==  null );
655-     assert (messages.isNotEmpty);
656685    _setStatus (FetchingStatus .fetchingMore, was:  FetchingStatus .idle);
657686    final  generation =  this .generation;
658687    bool  hasFetchError =  false ;
@@ -661,10 +690,10 @@ class MessageListView with ChangeNotifier, _MessageSequence {
661690      try  {
662691        result =  await  getMessages (store.connection,
663692          narrow:  narrow.apiEncode (),
664-           anchor:  NumericAnchor (messages[ 0 ].id) ,
693+           anchor:  anchor ,
665694          includeAnchor:  false ,
666-           numBefore:  kMessageListFetchBatchSize ,
667-           numAfter:  0 ,
695+           numBefore:  numBefore ,
696+           numAfter:  numAfter ,
668697          allowEmptyTopicName:  true ,
669698        );
670699      } catch  (e) {
@@ -673,21 +702,7 @@ class MessageListView with ChangeNotifier, _MessageSequence {
673702      }
674703      if  (this .generation >  generation) return ;
675704
676-       if  (result.messages.isNotEmpty
677-           &&  result.messages.last.id ==  messages[0 ].id) {
678-         // TODO(server-6): includeAnchor should make this impossible 
679-         result.messages.removeLast ();
680-       }
681- 
682-       store.reconcileMessages (result.messages);
683-       store.recentSenders.handleMessages (result.messages); // TODO(#824) 
684- 
685-       final  fetchedMessages =  _allMessagesVisible
686-         ?  result.messages // Avoid unnecessarily copying the list. 
687-         :  result.messages.where (_messageVisible);
688- 
689-       _insertAllMessages (0 , fetchedMessages);
690-       _haveOldest =  result.foundOldest;
705+       processResult (result);
691706    } finally  {
692707      if  (this .generation ==  generation) {
693708        if  (hasFetchError) {
0 commit comments