0

全新的flutter,不到10小时就可以了。

我有一个 PageView 处理 3 页,它完美地水平滚动它们。

但我想更改“允许滑动”区域。我不想让用户更改从页面的任何位置滚动的页面,而是例如,如果他在 AppBar 组件上滑动,就让他滚动页面。

我看到 PageView 有 applyTo 方法,我只是不知道如何给它 ID(keys) 或 appBar 看看这是否可行。

有没有办法实现这种“仅当用户在组件 X 上滑动时才滚动”?


编辑 1

Alberto Miola建议的解决方案就像一个魅力,这是我的代码(我必须从 PreferredSizeWidget 实现,因为需要修改 AppBar)。

class GestureDetectorForAppBar extends StatelessWidget implements PreferredSizeWidget {
  final double height;
  final AppBar appbar;
  final GestureDragUpdateCallback onPanUpdate;

  GestureDetectorForAppBar({
    Key key,
    this.appbar,
    this.onPanUpdate,
    @required this.height,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GestureDetector(child: this.appbar, onPanUpdate: this.onPanUpdate,);
  }

  @override
  Size get preferredSize => Size.fromHeight(height);
}
4

1 回答 1

4

首先,您需要使用NeverScrollableScrollPhysicsPageView来“阻止”自身的滑动手势:

PageView(
  physics: const NeverScrollableScrollPhysics(),
  children: [...],
  controller: ...
);

注意const构造函数的使用。这样,您将无法用手指在页面之间移动。在 Flutter 中,你有小部件而不是组件


看一下GestureDetector小部件,它可用于监听滑动并更改PageView. 它可用于检测滑动:

GestureDetector(
  onPanUpdate: (data) {
    if (data.delta.dx > 0) {
      // right swipe
    } 

    if (data.delta.dx < 0) {
      // right swipe
    }
  }
);

按顺序,我建议您先阅读NeverScrollableScrollPhysics()官方文档中的有关内容。它用于“阻止”滚动行为。然后,用于GestureDetector()包装您想要用作“滚动导演”(实际滚动页面的那个)的小部件。

在里面onPanUpdate你将处理改变当前可见页面的animateToPage方法。PageController

于 2020-06-21T12:48:43.340 回答