如何在Flutter中的“可禁用”小部件中禁用向左或向右滑动?

时间:2019-08-27 09:21:16

标签: flutter dart

一旦数据库中没有数据,我想禁止向右滑动。

if (data.length > 1) {
  // I can swipe to the left or right
} else {
  // I can't swipe to the right only left
}                          


实现这个目标真的吗? 也许,一旦将某个元素向右滑动,我就可以将其返回到中心

解决方案: 我只是在Dismissible小部件中使用了ConfirmDismiss。

confirmDismiss: (direction) {
  if(data.length > 0 && direction==..)
  // do stuff
  else if(...)
}

8 个答案:

答案 0 :(得分:5)

答案较晚,但是您可以将direction的{​​{1}}属性设置为Dismissibledirection: DismissDirection.endToStart,

答案 1 :(得分:2)

按照tomblue的想法,我提出了另一个想法,该想法不仅没有任何错误(包括编译和运行时错误),而且还允许开发人员防止向右或向左滑动:

我使用了将dismissThresholds中的属性设置为不可能值的三元数。完整示例如下:

class SwiperState extends State<Swiper> {
    bool _isNotFirstIndex = false;
    bool _isNotLastIndex = true;
    int _currentIndex = 0;

    void nextOne() {
        setState(() {
            _isNotFirstIndex = !(_currentIndex - 1 < 0);
            _isNotLastIndex = !(_currentIndex + 1 == count);
        });
    }

@override
  Widget build(BuildContext context) {
    return Dismissible(
        dismissThresholds:  {DismissDirection.startToEnd: _isNotFirstIndex ? 0.05 : 2.00, 
            DismissDirection.endToStart: _isNotLastIndex ? 0.05 : 2.00},
        key: UniqueKey(),
        onDismissed: (DismissDirection direction) {
          if(direction == DismissDirection.endToStart) {
            // dismissed to the left, next one
            nextOne();
          }
          else (do the same with prevOne())
               (...)

答案 2 :(得分:2)

您可以使用方向属性

将其设置为 DismissDirection.endToStartDismissDirection.startToEnd

Dismissible(
    direction: DismissDirection.endToStart,
    )

答案 3 :(得分:2)

如果有人想完全禁用关闭滑动(向左或向右),您可以使用 DismissDirection.none

*注意此参数目前仅在测试版频道可用

Dismissible(
  direction: data.length > 1 ? DismissDirection.endToStart : DismissDirection.none,
)

答案 4 :(得分:1)

AbsorbPointer包装可弃用的小部件。然后,每当您不希望取消该项目时,请将absorbing设置为true。检查此以获得更多信息link

答案 5 :(得分:1)

尽管Sergio的解决方案在您遇到简单情况时仍然有效,但在我的情况下,我在Dismissible小部件(需要接受其他类型的交互)下方有一棵复杂的树。

在@ flutter's source for Dismissible上偷看,我注意到我们可以将属性direction设置为null以防止滑动。例如:

Dismissible(
   key: UniqueKey(),
   direction: !_canSwipe ? null : DismissDirection.horizontal,
   (...)

虽然有点hacky,但由于小部件在第380行使用assert(widget.direction != null);,它会打印一些调试错误,但是它将按预期工作。

enter image description here

希望有帮助!

答案 6 :(得分:0)

答案 7 :(得分:0)

这是一个新提议的api更改,不幸的是,在此之前,我们不得不重用代码。

return isDisabled ?
      CardWidgetAndCode(
        ...
      )
    : Dismissible(
      child: CardWidgetAndCode( //  <-- duplicate code and/or function call
        ...
      )
    )