我有一个弹出对话框,其中包含单选按钮列表,只要选择单选按钮,无论当前是否选择它,我都希望弹出该对话框。
使用 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),
)
您可以将
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),
)
我根据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);
},
);
}
}