@@ -141,12 +141,17 @@ abstract class MessageListPageState {
141141}
142142
143143class MessageListPage extends StatefulWidget {
144- const MessageListPage ({super .key, required this .initNarrow});
144+ const MessageListPage ({
145+ super .key,
146+ required this .initNarrow,
147+ this .initAnchorMessageId,
148+ });
145149
146150 static AccountRoute <void > buildRoute ({int ? accountId, BuildContext ? context,
147- required Narrow narrow}) {
151+ required Narrow narrow, int ? initAnchorMessageId }) {
148152 return MaterialAccountWidgetRoute (accountId: accountId, context: context,
149- page: MessageListPage (initNarrow: narrow));
153+ page: MessageListPage (
154+ initNarrow: narrow, initAnchorMessageId: initAnchorMessageId));
150155 }
151156
152157 /// The [MessageListPageState] above this context in the tree.
@@ -162,6 +167,7 @@ class MessageListPage extends StatefulWidget {
162167 }
163168
164169 final Narrow initNarrow;
170+ final int ? initAnchorMessageId; // TODO(#1564) highlight target upon load
165171
166172 @override
167173 State <MessageListPage > createState () => _MessageListPageState ();
@@ -240,6 +246,10 @@ class _MessageListPageState extends State<MessageListPage> implements MessageLis
240246 actions.add (_TopicListButton (streamId: streamId));
241247 }
242248
249+ // TODO(#80): default to anchor firstUnread, instead of newest
250+ final initAnchor = widget.initAnchorMessageId == null
251+ ? AnchorCode .newest : NumericAnchor (widget.initAnchorMessageId! );
252+
243253 // Insert a PageRoot here, to provide a context that can be used for
244254 // MessageListPage.ancestorOf.
245255 return PageRoot (child: Scaffold (
@@ -259,7 +269,8 @@ class _MessageListPageState extends State<MessageListPage> implements MessageLis
259269 // we matched to the Figma in 21dbae120. See another frame, which uses that:
260270 // https://www.figma.com/file/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=147%3A9088&mode=dev
261271 body: Builder (
262- builder: (BuildContext context) => Column (
272+ builder: (BuildContext context) {
273+ return Column (
263274 // Children are expected to take the full horizontal space
264275 // and handle the horizontal device insets.
265276 // The bottom inset should be handled by the last child only.
@@ -279,11 +290,13 @@ class _MessageListPageState extends State<MessageListPage> implements MessageLis
279290 child: MessageList (
280291 key: _messageListKey,
281292 narrow: narrow,
293+ initAnchor: initAnchor,
282294 onNarrowChanged: _narrowChanged,
283295 ))),
284296 if (ComposeBox .hasComposeBox (narrow))
285297 ComposeBox (key: _composeBoxKey, narrow: narrow)
286- ]))));
298+ ]);
299+ })));
287300 }
288301}
289302
@@ -479,9 +492,15 @@ const kFetchMessagesBufferPixels = (kMessageListFetchBatchSize / 2) * _kShortMes
479492/// When there is no [ComposeBox] , also takes responsibility
480493/// for dealing with the bottom inset.
481494class MessageList extends StatefulWidget {
482- const MessageList ({super .key, required this .narrow, required this .onNarrowChanged});
495+ const MessageList ({
496+ super .key,
497+ required this .narrow,
498+ required this .initAnchor,
499+ required this .onNarrowChanged,
500+ });
483501
484502 final Narrow narrow;
503+ final Anchor initAnchor;
485504 final void Function (Narrow newNarrow) onNarrowChanged;
486505
487506 @override
@@ -504,8 +523,9 @@ class _MessageListState extends State<MessageList> with PerAccountStoreAwareStat
504523
505524 @override
506525 void onNewStore () { // TODO(#464) try to keep using old model until new one gets messages
526+ final anchor = _model == null ? widget.initAnchor : _model! .anchor;
507527 _model? .dispose ();
508- _initModel (PerAccountStoreWidget .of (context));
528+ _initModel (PerAccountStoreWidget .of (context), anchor );
509529 }
510530
511531 @override
@@ -516,10 +536,7 @@ class _MessageListState extends State<MessageList> with PerAccountStoreAwareStat
516536 super .dispose ();
517537 }
518538
519- void _initModel (PerAccountStore store) {
520- // TODO(#82): get anchor as page/route argument, instead of using newest
521- // TODO(#80): default to anchor firstUnread, instead of newest
522- final anchor = AnchorCode .newest;
539+ void _initModel (PerAccountStore store, Anchor anchor) {
523540 _model = MessageListView .init (store: store,
524541 narrow: widget.narrow, anchor: anchor);
525542 model.addListener (_modelChanged);
0 commit comments