Skip to content

Commit

Permalink
fix(UI/UX): more precise jump to selected article
Browse files Browse the repository at this point in the history
  • Loading branch information
casimir committed Nov 6, 2024
1 parent a69bfcd commit 570ff70
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
17 changes: 16 additions & 1 deletion lib/pages/articles/article_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,16 @@ class ArticleListView extends ConsumerStatefulWidget {
required this.doRefresh,
required this.onItemSelect,
required this.sideBySideMode,
this.headerOffset = 0,
this.indexOffset = 1,
});

final ScrollController? controller;
final Future<void> Function() doRefresh;
final void Function(int articleId)? onItemSelect;
final bool sideBySideMode;
final double headerOffset;
final int indexOffset;

@override
ConsumerState<ArticleListView> createState() => _ArticleListState();
Expand All @@ -31,6 +35,17 @@ class ArticleListView extends ConsumerStatefulWidget {
class _ArticleListState extends ConsumerState<ArticleListView> {
late final ScrollController _scroller;

double _computePixelsToScroll(int scrollToIndex) {
final targetIndex = scrollToIndex - widget.indexOffset;
final itemPixels = targetIndex * listingHeight;
final separatorsPixels = targetIndex.abs() * 16.0; // default Divider height
final targetPixels = (itemPixels + separatorsPixels - widget.headerOffset);
return targetPixels.clamp(
-1, // NestedScrollView wants a negative to work as expected
_scroller.position.maxScrollExtent,
);
}

@override
void initState() {
super.initState();
Expand All @@ -47,7 +62,7 @@ class _ArticleListState extends ConsumerState<ArticleListView> {
.indexOf(article!.id, query);
if (scrollToIndex != null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
_scroller.jumpTo(scrollToIndex * listingHeight);
_scroller.jumpTo(_computePixelsToScroll(scrollToIndex));
});
}
}
Expand Down
1 change: 1 addition & 0 deletions lib/pages/articles/listing.dart
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class _ListingPageState extends ConsumerState<ListingPage> {
doRefresh: () => doRefresh(),
onItemSelect: widget.onItemSelect,
sideBySideMode: widget.sideBySideMode,
headerOffset: 122.0, // height of SearchBarWithFilters
);
}),
),
Expand Down

0 comments on commit 570ff70

Please sign in to comment.