首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >滚动PageView

滚动PageView
EN

Stack Overflow用户
提问于 2020-04-24 19:41:55
回答 3查看 4.6K关注 0票数 2

我想使用垂直轴的PageView并使用鼠标滚动在页面之间移动,但是当我使用鼠标滚动时,页面不要滚动.只有当我单击并滑动到上/下时,页面才会滚动。

有什么办法吗?

我想保留属性pageSnapping: true

问题是:

当我尝试鼠标滚动页面,它不会改变,它只是回到最初的偏移量。但当我点击和滑动时.

代码语言:javascript
复制
class Body extends StatefulWidget {

  @override
  _BodyState createState() => _BodyState();
}

class _BodyState extends State<Body> {
  PageController _controller = PageController(keepPage: true);

  @override
  void initState() {
    super.initState();
 }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        height: Sizing.size.height,
        width: Sizing.size.width,
        child: Stack(
          children: <Widget>[
            PageView(
              scrollDirection: Axis.vertical,
              controller: _controller,
              children: <Widget>[
                Container(color: Colors.red),
                Container(color: Colors.blue),
                Container(color: Colors.orange),
              ],
            ),
          ],
        ),
      ),
    );
  }
}
EN

回答 3

Stack Overflow用户

发布于 2020-07-18 12:20:21

若要使用鼠标滚动,必须通过设置PageView来禁用physics: NeverScrollableScrollPhysics()的移动。然后,您必须手动拦截鼠标滚动通过一个Listener。如果你还想通过滑动恢复PageView经典动作,你必须使用GestureDetector。下面是一个示例代码:

代码语言:javascript
复制
class _HomepageState extends State<Homepage> {
  final PageController pageController = PageController();
  // this is like a lock that prevent update the PageView multiple times while is 
  // scrolling
  bool pageIsScrolling = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
          child: GestureDetector(
        // to detect swipe
        onPanUpdate: (details) {
          _onScroll(details.delta.dy * -1);
        },
        child: Listener(
          // to detect scroll
          onPointerSignal: (pointerSignal) {
            if (pointerSignal is PointerScrollEvent) {
              _onScroll(pointerSignal.scrollDelta.dy);
            }
          },
          child: PageView(
            scrollDirection: Axis.vertical,
            controller: pageController,
            physics: NeverScrollableScrollPhysics(),
            pageSnapping: true,
            children: [
               Container(color: Colors.red),
               Container(color: Colors.blue),
               Container(color: Colors.orange),
            ],
          ),
        ),
      )),
    );
  }

  void _onScroll(double offset) {
    if (pageIsScrolling == false) {
      pageIsScrolling = true;
      if (offset > 0) {
        pageController
            .nextPage(
                duration: Duration(milliseconds: 300),
                curve: Curves.easeInOut)
            .then((value) => pageIsScrolling = false);

        print('scroll down');
      } else {
        pageController
            .previousPage(
                duration: Duration(milliseconds: 300),
                curve: Curves.easeInOut)
            .then((value) => pageIsScrolling = false);
        print('scroll up');
      }
    }
  }
}
票数 5
EN

Stack Overflow用户

发布于 2020-04-24 19:54:17

要使内容通常可以滚动,您可以将小部件(>>right单击要用小部件制作scrollable>>refactor>>wrap的小部件)包装在SingleChildScrollView()中。

票数 0
EN

Stack Overflow用户

发布于 2021-02-19 04:52:53

感谢卢卡!

我只是修改了整件事来做同样的事情,问题是什么。

代码语言:javascript
复制
  Listener(
                onPointerMove: (pointerMove) {
                  if (pointerMove is PointerMoveEvent) {
                    _onScroll(pointerMove.delta.dy * -1);
                    print(pointerMove.delta.dy);
                  }
                },
                onPointerSignal: (pointerSignal) {
                  if (pointerSignal is PointerScrollEvent) {
                    _onScroll(pointerSignal.scrollDelta.dy);
                    print(pointerSignal.scrollDelta.dy);
                  }
                },
                child: SingleChildScrollView(
                  child: Container(
                    constraints: BoxConstraints(
                        minHeight: SizeConfig.screenHeight * .9),
                    width: SizeConfig.screenWidth,
                    height: SizeConfig.screenWidth / 2,
                    decoration: BoxDecoration(
                        image: DecorationImage(
                            alignment: Alignment.centerRight,
                            image: AssetImage(
                                'assets/images/background_circles.png'))),
                    child: PageView(
                      controller: _pageController,
                      physics: NeverScrollableScrollPhysics(),
                      pageSnapping: true,
                      scrollDirection: Axis.vertical,
                      children: [
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61416245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档