在 Flutter 中禁用可取消的组件是否可能?

时间:2021-08-12 04:08:35

标签: flutter

我正在构建一个基于 InteractiveViewer 的图像查看器。 InteractiveViewer 被包装在可消失的小部件中,当用户向上滑动时将关闭该小部件。

        Listener(

          onPointerMove: (PointerMoveEvent event) {

            if (_transformationController.value.getMaxScaleOnAxis() > 1.0) {
                     _canBeDismissed = false; }
            else { _canBeDismissed = true;  }

          },
          child: AnimatedOpacity(
            opacity:_opacity,
            duration: const Duration(milliseconds: 200),
            child: Dismissible(
              //direction: DismissDirection.vertical,
              direction: (_canBeDismissed == true) ? DismissDirection.vertical : DismissDirection.vertical,
              key: daKey,
              onDismissed: (_) => Navigator.of(context).pop(),
              child: GestureDetector(
                onDoubleTapDown: _handleDoubleTapDown,
                onDoubleTap: _handleDoubleTap,
                child: InteractiveViewer(
                  transformationController: _transformationController,
                  child:
                  Container(
                    alignment: Alignment.center,
                    decoration: BoxDecoration(
                      image:
                      DecorationImage(
                        image:
                        CachedNetworkImageProvider(image),
                        fit: BoxFit.contain,
                      ),
                    ),
                  ),
                ),
              ),
            ),
          ),
        )
    );

然而,当用户放大图片并尝试拖动图像时,它将关闭图像而不是允许用户拖动图像。

因此,我想简单地禁用 Dismissible,以防止在用户缩放图像时出现问题。我可以使用 Listener 检测到当图像被缩放时,并将变量 _canBeDismissed 设置为 true 或 false - 这不是问题。

问题在于如何程序化地禁用 Dismissible 功能?

我尝试通过更改方向并将其设置为 null 来实现此目的:

direction: (_canBeDismissed == true) ? DismissDirection.vertical : null,

但是,似乎不允许将其设置为 null,因此这没有起作用。我希望有某种 enabled 标志可以解决我的问题。有任何想法吗?或者有其他实现类似 Twitter 图像查看器功能的方式吗?(我已经尝试了一些在 pub.dev 上的大型存储库,但它们都似乎存在问题或无法实现)

谢谢!

1 个答案:

答案 0 :(得分:1)

你可以使用 confirmDismiss 参数来否决关闭。

示例:

Dismissible(
  confirmDismiss: (direction) async => _canBeDismissed,
  child: // ...
),