@@ -141,12 +141,17 @@ abstract class MessageListPageState {
141
141
}
142
142
143
143
class 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
+ });
145
149
146
150
static AccountRoute <void > buildRoute ({int ? accountId, BuildContext ? context,
147
- required Narrow narrow}) {
151
+ required Narrow narrow, int ? initAnchorMessageId }) {
148
152
return MaterialAccountWidgetRoute (accountId: accountId, context: context,
149
- page: MessageListPage (initNarrow: narrow));
153
+ page: MessageListPage (
154
+ initNarrow: narrow, initAnchorMessageId: initAnchorMessageId));
150
155
}
151
156
152
157
/// The [MessageListPageState] above this context in the tree.
@@ -162,6 +167,7 @@ class MessageListPage extends StatefulWidget {
162
167
}
163
168
164
169
final Narrow initNarrow;
170
+ final int ? initAnchorMessageId;
165
171
166
172
@override
167
173
State <MessageListPage > createState () => _MessageListPageState ();
@@ -240,6 +246,10 @@ class _MessageListPageState extends State<MessageListPage> implements MessageLis
240
246
actions.add (_TopicListButton (streamId: streamId));
241
247
}
242
248
249
+ // TODO(#80): default to anchor firstUnread, instead of newest
250
+ final initAnchor = widget.initAnchorMessageId == null
251
+ ? AnchorCode .newest : NumericAnchor (widget.initAnchorMessageId! );
252
+
243
253
// Insert a PageRoot here, to provide a context that can be used for
244
254
// MessageListPage.ancestorOf.
245
255
return PageRoot (child: Scaffold (
@@ -259,7 +269,8 @@ class _MessageListPageState extends State<MessageListPage> implements MessageLis
259
269
// we matched to the Figma in 21dbae120. See another frame, which uses that:
260
270
// https://www.figma.com/file/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=147%3A9088&mode=dev
261
271
body: Builder (
262
- builder: (BuildContext context) => Column (
272
+ builder: (BuildContext context) {
273
+ return Column (
263
274
// Children are expected to take the full horizontal space
264
275
// and handle the horizontal device insets.
265
276
// The bottom inset should be handled by the last child only.
@@ -279,11 +290,13 @@ class _MessageListPageState extends State<MessageListPage> implements MessageLis
279
290
child: MessageList (
280
291
key: _messageListKey,
281
292
narrow: narrow,
293
+ initAnchor: initAnchor,
282
294
onNarrowChanged: _narrowChanged,
283
295
))),
284
296
if (ComposeBox .hasComposeBox (narrow))
285
297
ComposeBox (key: _composeBoxKey, narrow: narrow)
286
- ]))));
298
+ ]);
299
+ })));
287
300
}
288
301
}
289
302
@@ -470,9 +483,15 @@ const kFetchMessagesBufferPixels = (kMessageListFetchBatchSize / 2) * _kShortMes
470
483
/// When there is no [ComposeBox] , also takes responsibility
471
484
/// for dealing with the bottom inset.
472
485
class MessageList extends StatefulWidget {
473
- const MessageList ({super .key, required this .narrow, required this .onNarrowChanged});
486
+ const MessageList ({
487
+ super .key,
488
+ required this .narrow,
489
+ required this .initAnchor,
490
+ required this .onNarrowChanged,
491
+ });
474
492
475
493
final Narrow narrow;
494
+ final Anchor initAnchor;
476
495
final void Function (Narrow newNarrow) onNarrowChanged;
477
496
478
497
@override
@@ -495,8 +514,9 @@ class _MessageListState extends State<MessageList> with PerAccountStoreAwareStat
495
514
496
515
@override
497
516
void onNewStore () { // TODO(#464) try to keep using old model until new one gets messages
517
+ final anchor = _model == null ? widget.initAnchor : _model! .anchor;
498
518
_model? .dispose ();
499
- _initModel (PerAccountStoreWidget .of (context));
519
+ _initModel (PerAccountStoreWidget .of (context), anchor );
500
520
}
501
521
502
522
@override
@@ -507,10 +527,7 @@ class _MessageListState extends State<MessageList> with PerAccountStoreAwareStat
507
527
super .dispose ();
508
528
}
509
529
510
- void _initModel (PerAccountStore store) {
511
- // TODO(#82): get anchor as page/route argument, instead of using newest
512
- // TODO(#80): default to anchor firstUnread, instead of newest
513
- final anchor = AnchorCode .newest;
530
+ void _initModel (PerAccountStore store, Anchor anchor) {
514
531
_model = MessageListView .init (store: store,
515
532
narrow: widget.narrow, anchor: anchor);
516
533
model.addListener (_modelChanged);
0 commit comments