[英]How to enable swiping on all 4 directions in the Dismissible Widget in Flutter?
[英]How to disable swiping left or right in Dismissible widget in Flutter?
一旦数据库中没有数据,我想禁用向右滑动。
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(...)
}
虽然 Sergio 的解决方案在您有一个简单场景时有效,但在我的情况下,我在 Dismissible 小部件下方有一个复杂的树(它需要接受其他类型的交互)。
查看 @flutter 的 Dismissible 源,我注意到我们可以将属性direction
设置为DismissDirection.none
以防止滑动。 例如:
Dismissible(
key: UniqueKey(),
direction: !_canSwipe ? DismissDirection.none : DismissDirection.horizontal,
(...)
希望能帮助到你!
一个迟到的答案,但您可以将 Dismissible 的direction
属性设置为方向: Dismissible
direction: DismissDirection.endToStart,
或direction: DismissDirection.startToEnd,
您可以使用方向属性
将其设置为DismissDirection.endToStart
或DismissDirection.startToEnd
Dismissible(
direction: DismissDirection.endToStart,
)
用AbsorbPointer
包裹可关闭的小部件。 然后,当您不想关闭项目时,将absorbing
设置为 true。 检查此以获取更多信息链接
如果有人想完全禁用关闭滑动(向左或向右),您可以使用 DismissDirection.none
*注意此参数目前仅在 beta 通道可用
Dismissible(
direction: data.length > 1 ? DismissDirection.endToStart : DismissDirection.none,
)
按照 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())
(...)
这是一个新提议的 api 更改,不幸的是,在那之前我们必须重用代码。
return isDisabled ?
CardWidgetAndCode(
...
)
: Dismissible(
child: CardWidgetAndCode( // <-- duplicate code and/or function call
...
)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.