颤振如何获取最后的PageView滚动方向

时间:2018-09-06 11:54:21

标签: flutter

我正在尝试使用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方法 多次返回。 在当前页面完全切换到下一页后,有什么方法可以获取此信息?

  

颤动:向右滑动
  颤动:向右滑动
  颤动:向右滑动
  颤动:向右滑动
  颤动:向右滑动
  颤动:向右滑动
  颤动:向右滑动
  颤动:向右滑动
  颤动:向右滑动
  颤动:向右滑动
  颤动:向右滑动

4 个答案:

答案 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');
      }
    });

  }