Flutter 如何在Flatter中使用手势识别器实现页面视图的滑动手势?

Flutter 如何在Flatter中使用手势识别器实现页面视图的滑动手势?,flutter,flutter-animation,flutter-pageview,Flutter,Flutter Animation,Flutter Pageview,我正在尝试从Instagram重新创建MediaPicker 此屏幕的当前结构如下所示: return Scaffold( appBar: buildAppBar(context), body: PageView( physics: NeverScrollableScrollPhysics(), //disable the "normal" pageview scrolling onPageChanged: (i

我正在尝试从Instagram重新创建MediaPicker

此屏幕的当前结构如下所示:

    return Scaffold(
      appBar: buildAppBar(context),
      body: PageView(
        physics: NeverScrollableScrollPhysics(), //disable the "normal" pageview scrolling
        onPageChanged: (index) {
          setState(() {
            pageIndex = index;
          });
        },
        controller: pageController,
        children: [
          Column(
            children: [
              Expanded(
                flex: 3,
                child: buildPreviewWidget(selection, _buildCropPreview), //this cropview has a gesture recognizer on it
              ),
              const SizedBox(height: 2),
              Expanded(
                  flex: 2,
                  child: GestureDetector(
                    onHorizontalDragStart: (details) {
                      double offset = screenWidth - details.localPosition.dx;
                      pageController.jumpTo(offset);
                    },
                    onHorizontalDragUpdate: (details) {
                      double offset = screenWidth - details.localPosition.dx;
                      pageController.jumpTo(offset);
                    },
                    child:MediaGrid( //this is the media grid
                            allowMultiSelection: multiSelectable,
                            collection: allCollection),
                  )),
            ],
          ),
          CameraScreen(),
        ],
      ),
      bottomNavigationBar: buildBottomNavigationBar(),
    );
  
最初的问题是,每当我在cropview中拖动时,页面视图的滑动手势就会被触发,这不是我想要的

因此,我的想法是禁用使用
NeverScrollableScrollPhysics()
滚动的标准方式,然后使用
GestureRecognitizer()
仅包装
MediaGrid()
,这样我就可以借助PageViews
pageController.jumpTo()
实现相同的滑动动画,但只能在
MediaGrid()上

然而,我的实现似乎很糟糕,因为页面视图像这样断断续续


如何平滑口吃,或者有更好的方法来实现这一点吗?

onHorizontalDragUpdate
案例中,尝试
pageController.jumpTo(pageController.offset-details.delta.dx)
-口吃可能与更改的“本地位置”有关抱歉,我还没有机会测试它,将尽快让您知道。@pskink似乎可以大大改善口吃,但页面视图仍希望捕捉到其中一个屏幕。所以当我拖动它到50%偏移量时,它会自动移动。我觉得这是因为我只在水平DragUpdate中调用了
pageController.jumpTo()
,所以当我停下来并只将屏幕保持在50%时,事件就不会被触发了。只要我触摸屏幕,有没有办法制作动画?很可能你需要
onHorizontalDragEnd
我终于找到了解决方案。结果表明,PageView有一个默认为true的
pageSnapping
属性。现在,当
onHorizontalDragStart
运行时,我将
pageSnapping
设置为false,当
onHorizontalDragEnd
运行得像个符咒时,我将其设置为true。谢谢