A.
Appendix A: Chapter 5 Solution 1
Written by Vincent Ngo
First you need to make ExploreScreen a StatefulWidget. That is because you need to preserve the state of the scroll controller.
Next add a ScrollController property in _ExploreScreenState:
ScrollController _controller;
Then, add a function called scrollListener(), which is the function callback that will listen to the scroll offsets.
void _scrollListener() {
// 1
if (_controller.offset >= _controller.position.maxScrollExtent &&
!_controller.position.outOfRange) {
print('i am at the bottom!');
}
// 2
if (_controller.offset <= _controller.position.minScrollExtent &&
!_controller.position.outOfRange) {
print('i am at the top!');
}
}
Here’s how the code works:
- Check the scroll offset, and see if the position is greater than or equal to the
maxScrollExtent. That means the user has scrolled to the very bottom. - Check if the scroll offset is less than or equal to the
minScrollExtend. That means the user has scrolled to the very top.
Within _ExploreScreenState, override the initState() method as shown below:
@override
void initState() {
// 1
_controller = ScrollController();
// 2
_controller.addListener(_scrollListener);
super.initState();
}
Here’s how the code works:
- You initialize the scroll controller.
- You add a listener to the controller. Every time the user scrolls,
scrollListener()will get called.
Within the ExploreScreen’s parent ListView, all you have to do is set the scroll controller as shown below:
return ListView(
controller: _controller,
...
That will tell the scroll controller to listen to this particular list view’s scroll events.
Some use cases for when you might need a scroll controller:
- Detect if you are at a certain offset.
- Control the scroll movement by animating to a specific index.
- Check to see if the scroll view has started, stop, or ended.