嗨,我试图用我的自定义constroller和一个监听器在flutter中构建一个简单的列表。 这是代码
class Test2 extends StatefulWidget {
@override
_Test2State createState() => _Test2State();
}
class _Test2State extends State<Test2> {
ScrollController scrollController = ScrollController();
@override
void initState() {
scrollController.addListener((){
print('controller called');
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
controller: scrollController,
itemCount: 8,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
color: Colors.white,
height: 50,
),
);
},
));
}
}
我的代码按预期工作,但是我试图检测用户滑动,即使没有要滑动的内容也是如此。到目前为止,如果调用用户滑动滚动侦听器时列表溢出屏幕,但是当项目列表短于屏幕大小时,则不会发生这种情况。 我该如何强制收听者始终收听?
答案 0 :(得分:1)
也许这段代码可以为您提供帮助。
将支架包裹在NotificationListener上可以监听所有事件,即使itemCount为零
不要忘记提供一个 AlwaysScrollableScrollPhysics 物理对象
import 'dart:math' as math;
import 'package:flutter/material.dart';
class TestPage extends StatefulWidget {
@override
_TestPageState createState() => _TestPageState();
}
class _TestPageState extends State<TestPage> {
@override
Widget build(BuildContext context) {
final ScrollController scrollController = ScrollController();
return NotificationListener(
child: Scaffold(
body: ListView.builder(
controller: scrollController,
physics: const AlwaysScrollableScrollPhysics(),
itemCount: 0,
itemBuilder: (context, index) {
return Container(
color: Colors.black,
height: 50,
);
},
),
),
onNotification: (notificationInfo) {
if (notificationInfo is ScrollStartNotification) {
print("scroll");
print("detail:"+notificationInfo.dragDetails.toString());
/// your code
}
return true;
},
);
}
}
答案 1 :(得分:0)
您必须通过以下方式将自定义滚动侦听器传递给该函数:
scrollController.addListener(_scrollListener);
完成:
@override
void initState() {
scrollController.addListener(_scrollListener);
super.initState();
}
和您的自定义滚动侦听器方法:
_scrollListener() {
if (_controller.offset >= _controller.position.maxScrollExtent &&
!_controller.position.outOfRange) {
setState(() {
message = "reach the bottom";
});
}
if (_controller.offset <= _controller.position.minScrollExtent &&
!_controller.position.outOfRange) {
setState(() {
message = "reach the top";
});
}
}