如何在Flutter中禁用Dismissible小部件的左右滑动功能?

9
我希望禁用向右滑动的功能,当数据库中没有数据时。
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个回答

19

虽然回答有些晚,但你可以设置Dismissibledirection属性,使用direction: DismissDirection.endToStart,或者direction: DismissDirection.startToEnd,


14

虽然Sergio的解决方案对于简单场景是有效的,但在我的情况下,我有一个Dismissible小部件下面的复杂树(需要接受其他类型的交互)。

查看flutter Dismissible源代码后,我注意到我们可以将direction属性设置为DismissDirection.none以防止滑动。例如:

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

希望有所帮助!


5
ه°†nullو›؟وچ¢ن¸؛DismissDirection.noneم€‚ - Maker Jr

13

您可以使用方向属性

将其设置为DismissDirection.endToStartDismissDirection.startToEnd


Dismissible(
    direction: DismissDirection.endToStart,
    )

1
这是唯一正确的答案。其他选项也会产生相同的结果,但如果有属性可用,为什么要过度编码呢。 - V Nikoyan

8

使用 AbsorbPointer 包装可消除的小部件。然后,每当您不想要项目被解雇时,请将 absorbing 设置为 true。查看此链接以获取更多信息:链接


虽然AbsorbPointer可以防止滑动,但也将阻止与Dismissable中的元素进行点击和交互,其中可能包括按钮和复选框(在我的情况下)。@tomblue提供的解决方案最准确。 - Alexandre T.

8

如果有人想完全禁用滑动操作(左或右),可以使用DismissDirection.none。

*请注意,此参数目前仅在beta渠道上可用。

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

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())
               (...)


-1

这是一个新提出的API更改,但在那之前不幸的是我们必须重复使用代码。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接