NotificationListener<ScrollEndNotification>(
child: ListView(
controller: _scrollController,
children: ...
),
onNotification: (notification) {
print(_scrollController.position.pixels);
// Return true to cancel the notification bubbling. Return false (or null) to
// allow the notification to continue to be dispatched to further ancestors.
return true;
},
),
@override
void initState() {
super.initState();
_scrollController = ScrollController();
_scrollController.addListener(() {
var _currectScrollPosition = _scrollController.position.pixels;//this is the line
});
}
使用此代码 类NotificationListenerListviewscroolller扩展StatelessWidget { NotificationListenerListviewscroolller({super.key}); int n = int n(); @override Widget build(BuildContext context){ final title = 'Grid List'; return Scaffold(appBar:AppBar(标题:文本(标题),),
body: NotificationListener<ScrollNotification>(
onNotification: (scrollNotification) {
print('inside the onNotification');
if (_scrollController.position.userScrollDirection ==
ScrollDirection.reverse) {
print('scrolled down');
//the setState function
} else if (_scrollController.position.userScrollDirection ==
ScrollDirection.forward) {
print('scrolled up');
//setState function
}
return true;
},
child: ListView(
controller: _scrollController,
// This next line does the trick.
scrollDirection: Axis.vertical,
children: <Widget>[
Container(
height: 200.0,
color: Colors.red,
),
Container(
height: 160.0,
color: Colors.blue,
),
Container(
height: 160.0,
color: Colors.green,
),
Container(
height: 160.0,
color: Colors.yellow,
),
Container(
height: 160.0,
color: Colors.orange,
),
Container(
height: 200.0,
color: Colors.red,
),
Container(
height: 160.0,
color: Colors.blue,
),
Container(
height: 160.0,
color: Colors.green,
),
Container(
height: 160.0,
color: Colors.yellow,
),
Container(
height: 160.0,
color: Colors.orange,
),
],
),
), // This trailing comma makes auto-formatting nicer for build methods.
);
9条答案
按热度按时间zaqlnxep1#
我使用了
NotificationListener
,这是一个小部件,用于侦听树中冒泡的通知。然后使用ScrollEndNotification
,表示滚动已停止。对于滚动位置,我使用
_scrollController
,类型为ScrollController
。字符串
ffvjumwh2#
majidfathi69的答案很好,但你不需要在列表中添加控制器:(如果您只希望在滚动结束时收到通知,请将
ScrollUpdateNotification
更改为ScrollEndNotification
。)字符串
yqlxgs2m3#
NotificationListener
现在接受一个类型参数,这使得代码更短:)字符串
hgtggwj04#
您还可以通过以下步骤实现此功能
字符串
的数据
kjthegm65#
如果你想检测你的
ListView
的滚动位置,你可以简单地使用它;Scrollable.of(context).position.pixels
vdzxcuhz6#
除了@seddiq-sorush answer,你可以将当前位置与
_scrollController.position.maxScrollExtent
进行比较,看看列表是否在底部n53p2ov07#
https://coflutter.com/flutter-check-if-the-listview-reaches-the-top-or-the-bottom/源
如果有些人想检测列表视图的底部,然后使用这种方法
字符串
fnx2tebb8#
我会说你可以很容易地检测滚动位置
字符串
但是如果你要在addListener()中调用setState;这是可以的,但这将导致重新构建整个构建(上下文)。这不是一个很好的做法,特别是动画。
我推荐的是把你的滚动小部件分割成一个分割的StatefulWidget,然后通过调用
型
注:设置GlobalKey,并分配给StatFulWidget。
型
yzuktlbb9#
使用此代码
类NotificationListenerListviewscroolller扩展StatelessWidget { NotificationListenerListviewscroolller({super.key});
int n = int n();
@override Widget build(BuildContext context){ final title = 'Grid List'; return Scaffold(appBar:AppBar(标题:文本(标题),),
字符串
{\fnSimHei\bord1\shad1\pos(200,288)}