【问题标题】:How to skip Flutter Widget in tap detection?如何在点击检测中跳过 Flutter Widget?
【发布时间】:2019-03-29 18:41:31
【问题描述】:

我正在尝试制作一个带有 ListTiles 的模态底部表,其中包含 Checkbox 作为前导小部件。但是,Checkbox 将接收点击事件而不是 ListTile,现在显示磁贴的墨水波纹效果并让我实现两个 onTap/onChanged 回调。

我尝试不实现CheckboxonChanged 回调并将其包裹在AbsorbPointer 小部件周围,但是在这两种情况下ListTile 也不会获得点击事件。

return ListTile(
  onTap: onTap,
  title: Text("Show expired schedules"),
  leading: Checkbox(value: snapshot.data, onChanged: (_) => onTap()),
);

我想以某种方式使Checkbox 不可点击,但让ListTile 仍然接收点击事件。有点像AbsorbPointer,除了跳过一个小部件,不完全吸收点击事件。

【问题讨论】:

  • 我仍然很想听到正确的答案,但如果您处于紧要关头,您可以随时删除复选框并使用图标并更改代码中的图标。选中未选中。 ?
  • @Zuriel Checkbox 有一个动画,当值改变时,它比两个单独的图标更容易实现
  • 为什么不直接删除onChange
  • 我猜是因为删除 onChange 方法将使用主题中的 disabledColor 作为复选框。
  • @Rémi Rousselet @diegoveloper 是的,它将使用 disabledColor 并且仍然吸收触摸事件,而不是将其传递给 ListTile

标签: flutter


【解决方案1】:

将您的 Checkbox 小部件包装在 IgnorePointer 小部件中,它应该可以工作:

return ListTile(
  onTap: onTap,
  title: Text("Show expired schedules"),
  leading: IgnorePointer(child: Checkbox(value: snapshot.data, onChanged: (_) => onTap())),
);

【讨论】:

  • 谢谢!他们应该也将这个包含在 AbsorbPointer 的本周小部件中。
【解决方案2】:

你也可以使用AbsorbPointer 来做到这一点

return ListTile(
  onTap: onTap,
  title: Text("Show expired schedules"),
  leading: AbsorbPointer(
    absorbing: _condition, // bool value, true makes it absorb touch event on CheckBox still making ListTile tappable. 
    child: Checkbox(value: snapshot.data, onChanged: (_) => onTap()),
  ),
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-13
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多