-
Notifications
You must be signed in to change notification settings - Fork 16
added support for hiding header onListViewScroll #2041
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
M-Taha-Dev
wants to merge
6
commits into
main
Choose a base branch
from
collapsableHeader
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 1 commit
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
7a48691
added support for hiding header onListViewScroll
M-Taha-Dev d935786
fixed scroller initialization issue
M-Taha-Dev 2d9d540
fix 2
M-Taha-Dev 671661b
fix 3
M-Taha-Dev 1ba0b95
fix 3
M-Taha-Dev 91484d8
fix 4
M-Taha-Dev File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -93,7 +93,7 @@ class PageState extends State<Page> | |
|
||
@override | ||
bool get wantKeepAlive => true; | ||
|
||
@override | ||
void didUpdateWidget(covariant Page oldWidget) { | ||
super.didUpdateWidget(oldWidget); | ||
|
@@ -196,6 +196,7 @@ class PageState extends State<Page> | |
@override | ||
void didPopNext() { | ||
super.didPopNext(); | ||
currentPageKey = widget._pageModel.hashCode.toString(); | ||
if (widget._pageModel.viewBehavior.onResume != null) { | ||
ScreenController().executeActionWithScope( | ||
context, _scopeManager, widget._pageModel.viewBehavior.onResume!, | ||
|
@@ -253,6 +254,7 @@ class PageState extends State<Page> | |
// has completely rendered. This will be sufficient for most use case | ||
widget.onRendered(); | ||
}); | ||
|
||
} | ||
|
||
// build the root widget | ||
|
@@ -270,6 +272,7 @@ class PageState extends State<Page> | |
// Adding a listener for [viewGroupNotifier] so we can execute | ||
// onViewGroupUpdate when change in parent ViewGroup occurs | ||
viewGroupNotifier.addListener(executeOnViewGroupUpdate); | ||
|
||
} | ||
|
||
/// This is a callback because we need the widget to be first instantiate | ||
|
@@ -503,7 +506,9 @@ class PageState extends State<Page> | |
// whether to usse CustomScrollView for the entire page | ||
bool isScrollableView = | ||
widget._pageModel.runtimeStyles?['scrollableView'] == true; | ||
|
||
|
||
bool collapsableHeader = widget._pageModel.runtimeStyles?['collapsableHeader'] == true; | ||
bool collapseSafeArea = widget._pageModel.runtimeStyles?['collapseSafeArea'] == true; | ||
PreferredSizeWidget? fixedAppBar; | ||
if (!isScrollableView) { | ||
fixedAppBar = buildFixedAppBar(widget._pageModel, hasDrawer); | ||
|
@@ -544,12 +549,20 @@ class PageState extends State<Page> | |
|
||
// appBar is inside CustomScrollView if defined | ||
appBar: fixedAppBar, | ||
body: FooterLayout( | ||
body: isScrollableView | ||
? buildScrollablePageContent(hasDrawer) | ||
: buildFixedPageContent(fixedAppBar != null), | ||
footer: footerWidget, | ||
), | ||
body: FooterLayout( | ||
body: isScrollableView | ||
? (collapsableHeader == true | ||
? (collapseSafeArea == true | ||
? SafeArea( | ||
top: true, | ||
bottom: false, // Let footer handle bottom safe area | ||
child: buildScrollablePageContentWithCollapsableHeader(hasDrawer) | ||
) | ||
: buildScrollablePageContentWithCollapsableHeader(hasDrawer)) | ||
: buildScrollablePageContent(hasDrawer)) | ||
: buildFixedPageContent(fixedAppBar != null), | ||
footer: footerWidget, | ||
), | ||
bottomNavigationBar: _bottomNavBar, | ||
drawer: _drawer, | ||
endDrawer: _endDrawer, | ||
|
@@ -611,7 +624,7 @@ class PageState extends State<Page> | |
return getBody(hasAppBar); | ||
} | ||
|
||
Widget buildScrollablePageContent(bool hasDrawer) { | ||
Widget buildScrollablePageContent(bool hasDrawer) { | ||
List<Widget> slivers = []; | ||
externalScrollController = ScrollController(); | ||
// appBar | ||
|
@@ -631,6 +644,37 @@ class PageState extends State<Page> | |
slivers: slivers, | ||
); | ||
} | ||
Widget buildScrollablePageContentWithCollapsableHeader(bool hasDrawer) { | ||
bool isScrollableView = widget._pageModel.runtimeStyles?['scrollableView'] == true; | ||
if (isScrollableView) { | ||
currentPageKey = widget._pageModel.hashCode.toString(); | ||
if (persistentControllers.containsKey(currentPageKey!)) { | ||
externalScrollController = ScrollController(); | ||
persistentControllers[currentPageKey!] = externalScrollController!; | ||
} else { | ||
externalScrollController = ScrollController(); | ||
persistentControllers[currentPageKey!] = externalScrollController!; | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why this |
||
} | ||
return NestedScrollView( | ||
controller: externalScrollController, | ||
physics: ClampingScrollPhysics(), | ||
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { | ||
List<Widget> slivers = []; | ||
// Build the AppBar using your existing method | ||
Widget? appBar = buildSliverAppBar(widget._pageModel, hasDrawer); | ||
|
||
// Add AppBar to slivers if it exists and is not manually hidden | ||
if (appBar != null) { | ||
slivers.add(appBar); | ||
} | ||
|
||
return slivers; | ||
}, | ||
body: getBody(true), // Pass true since we have a header structure | ||
); | ||
|
||
} | ||
|
||
Widget getBody(bool hasAppBar) { | ||
// ignore safe area is only applicable if we don't have an AppBar | ||
|
@@ -994,6 +1038,7 @@ class _AnimatedAppBarState extends State<AnimatedAppBar> with WidgetsBindingObse | |
collapsedHeight: widget.collapsedBarHeight, | ||
expandedHeight: widget.expandedBarHeight, | ||
pinned: widget.pinned, | ||
floating: widget.floating, | ||
centerTitle: widget.centerTitle, | ||
title: widget.animated | ||
? switch (widget.animationType) { | ||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -103,6 +103,7 @@ class _ListViewCoreState extends State<ListViewCore> { | |
late final Debouncer debounce; | ||
late final Debouncer _scrollDebouce; | ||
late final ScrollController _scrollController; | ||
double _previousOffset = 0.0; | ||
|
||
int? _lastFetchedIndex; | ||
|
||
|
@@ -161,16 +162,24 @@ class _ListViewCoreState extends State<ListViewCore> { | |
// given the nestedScroll property is set to true and View is Scrollable | ||
// Note that we are not using jumpTo to avoid jerky movement of external | ||
// Scroll instead we are using animateTo which is smoother than jumpTo | ||
ScrollController? currentExternalScrollController = persistentControllers[currentPageKey]; | ||
if (externalScrollController != null && | ||
widget.nestedScroll && | ||
widget.shrinkWrap) { | ||
final currentOffset = _scrollController.position.pixels; | ||
_scrollController.addListener(() { | ||
|
||
final currentOffset = _scrollController.offset; | ||
final scrollingUp = currentOffset > _previousOffset; | ||
final scrollingDown = currentOffset < _previousOffset; | ||
|
||
if (scrollingUp) { | ||
currentExternalScrollController!.animateTo(100, duration: const Duration(milliseconds: 16), curve: Curves.linear); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please use the values from |
||
} else if (scrollingDown && currentOffset > 0) { | ||
currentExternalScrollController!.jumpTo(0); | ||
} | ||
|
||
externalScrollController!.animateTo( | ||
currentOffset, | ||
duration: const Duration(milliseconds: 300), | ||
curve: Curves.easeInOut, | ||
); | ||
_previousOffset = currentOffset; | ||
}); | ||
} | ||
} | ||
|
||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you please format the code.