如何将onTap事件应用到RadioListTile?

问题描述 投票:0回答:2

我有一个弹出对话框,其中包含单选按钮列表,只要选择单选按钮,无论当前是否选择它,我都希望弹出该对话框。

使用 flutter 框架中包含的 Radio 或 RadioListTile 小部件仅允许 onChanged 事件,该事件仅在发生更改时才会触发。这意味着如果已经选择了某个项目,则不会弹出该对话框。

toggleable 属性只是一个属性,不允许使用额外的指令来弹出对话框。它只是有一个内部切换来取消选择该值。

我尝试用 GestureDetector 包装 RadioListTile,但这不起作用,因为 RadioListTile 的子项 (ListTile) 具有点击优先级。

还有其他第三个包可以做得更好,但我更愿意尽可能坚持使用内置小部件。

如有任何帮助,我们将不胜感激。请参阅下面的代码片段:

RadioListTile<Folder>(
  value: controller.folders[index],
  groupValue: controller.selectedFolder.value,
  onChanged: (newValue){
    // This callback is not invoked when an item is already selected
    controller.selectedFolder.value = newValue ?? controller.folders[0];
    // I'd like this to be called even if item has not changed
    Get.back(result: controller.selectedFolder.value);
  },
  title: Text(folder.isEmpty ? 'None' : folder.name),
)
flutter
2个回答
5
投票

您可以将

toggleable
设置为
true
,并且仅当新值不是
null
时才更新。例如

RadioListTile<Folder>(
  value: controller.folders[index],
  groupValue: controller.selectedFolder.value,
  toggleable: true,
  onChanged: (newValue) {
    if (newValue != null) {
      controller.selectedFolder.value = newValue;
    }

    Get.back(result: controller.selectedFolder.value);
  },
  title: Text(folder.isEmpty ? 'None' : folder.name),
)

0
投票

我根据khw147评论制作了这个小部件

class RadioListTileClickable<T> extends StatefulWidget {
  final String title;
  final T value;
  T groupValue;
  final ValueChanged<T>? onClicked;

  RadioListTileClickable(
      {super.key, required this.title, required this.value, required this.groupValue, this.onClicked});

  @override
  State<RadioListTileClickable<T>> createState() => _RadioListTileClickableState<T>();
}

class _RadioListTileClickableState<T> extends State<RadioListTileClickable<T>> {
  @override
  Widget build(BuildContext context) {
    return RadioListTile.adaptive(
      toggleable: true,
      title: Text(widget.title),
      value: widget.value,
      groupValue: widget.groupValue,
      contentPadding: const EdgeInsets.all(0.0),
      onChanged: (value) {
        setState(() {
          widget.groupValue = value ?? widget.value;
        });
        widget.onClicked?.call(widget.groupValue);
      },
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.