我正在尝试使用PageView
来获取用户向哪个方向(向左或向右)滑动。
我能够这样得到方向。
代码:
PageController _controller;
@override
void initState() {
_controller = new PageController()..addListener(_listener);
super.initState();
}
_listener() {
if (_controller.position.userScrollDirection == ScrollDirection.reverse) {
print('swiped to right');
} else {
print('swiped to left');
}
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(),
body: PageView.builder(
itemCount: 10,
controller: _controller,
itemBuilder: (context, index) {
return new Center(child: Text('item ${++index}'));
}),
);
}
但是,由于滚动尚未结束,因此print
方法
多次返回。
在当前页面完全切换到下一页后,有什么方法可以获取此信息?
颤动:向右滑动
颤动:向右滑动
颤动:向右滑动
颤动:向右滑动
颤动:向右滑动
颤动:向右滑动
颤动:向右滑动
颤动:向右滑动
颤动:向右滑动
颤动:向右滑动
颤动:向右滑动
答案 0 :(得分:1)
将当前_controller.page.round()
与上一个侦听器调用中的值进行比较(将先前的值存储在State
中)。
答案 1 :(得分:1)
使用PageView窗口小部件的内置函数,如下是一个更好的解决方案。
PageView(
onPageChanged: (int page) {
// this page variable is the new page and will change before the pageController fully reaches the full, rounded int value
var swipingRight = page > pageController.page;
print(swipingRight);
},
答案 2 :(得分:1)
这里的所有解决方案都不适合我,弄清楚这是一个巨大的麻烦。
我最终使用了手势检测器并完全禁用了PageView手势。
NeverScrollableScrollPhysics()
是禁用PageView内置手势的方式。
class MyPageView extends StatefulWidget {
@override
_MyPageViewState createState() => _MyPageViewState();
}
class _MyPageViewState extends State<MyPageView> {
PageController _pageController;
Duration pageTurnDuration = Duration(milliseconds: 500);
Curve pageTurnCurve = Curves.ease;
@override
void initState() {
super.initState();
// The PageController allows us to instruct the PageView to change pages.
_pageController = PageController();
}
void _goForward() {
_pageController.nextPage(duration: pageTurnDuration, curve: pageTurnCurve);
}
void _goBack() {
_pageController.previousPage(
duration: pageTurnDuration, curve: pageTurnCurve);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
// Using the DragEndDetails allows us to only fire once per swipe.
onHorizontalDragEnd: (dragEndDetails) {
if (dragEndDetails.primaryVelocity < 0) {
// Page forwards
print('Move page forwards');
_goForward();
} else if (dragEndDetails.primaryVelocity > 0) {
// Page backwards
print('Move page backwards');
_goBack();
}
},
child: PageView.builder(
itemCount: 10,
controller: _pageController,
// NeverScrollableScrollPhysics disables PageView built-in gestures.
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
return new Center(child: Text('item ${++index}'));
}),
),
);
}
}
答案 3 :(得分:0)
您的代码可以,只需添加一个setState 像这样
PageController _controller;
@override
void initState() {
_controller = new PageController()..addListener(_listener);
super.initState();
}
_listener() {
setState(() {
if (_controller.position.userScrollDirection == ScrollDirection.reverse) {
print('swiped to right');
} else {
print('swiped to left');
}
});
}