我正在使用Radio
小部件来设置用户性别。这些Radio
按钮小部件设计得很好,可以处理相应的选择更改,但是我找不到解决方案以某种方式取消选择一个已经选择的选项。我希望性别广播小组是可选的。但是,在用户选择女性后,他/她可以将选择更改为男性,但不能取消选择女性/男性选项。 (因此,不会选择任何选项。)
只有onChanged
属性,并且仅在性别发生变化时才发生变化。没有类似onTap
之类的东西。因此,无论我是否检查性别是否相同,onChanged
都不会被调用。
由于这个原因,我尝试使用GestureDetector
来解决此问题(因此,我应该能够取消选择已选择的选项),但是在单选窗口小部件不起作用的情况下。我也尝试更改它的behavior
属性,但也没有帮助。
这是我用来创建带有Row
中文本的性别广播选项的功能。
Widget _buildRadioWithText(final genderChangeNotifier, final Gender genderParam, final String genderText) {
return Row(
children: <Widget>[
GestureDetector(
behavior: HitTestBehavior.translucent,
child: Radio<Gender>(
visualDensity: VisualDensity.compact,
value: genderParam,
groupValue: genderChangeNotifier.gender,
onChanged: (Gender gender) {
genderChangeNotifier.gender = gender;
print(gender.toString());
},
),
onTap: () {
if (genderChangeNotifier.gender == genderParam) {
genderChangeNotifier.gender = Gender.NA;
print("Not answered!");
}
},
),
GestureDetector(
onTap: () {
if (genderChangeNotifier.gender == genderParam) {
genderChangeNotifier.gender = Gender.NA;
print("Not answered!");
} else {
genderChangeNotifier.gender = genderParam;
print(genderParam.toString());
}
},
child: Text(
genderText,
style: TextStyle(
fontSize: _fontSize,
),
),
),
],
);
}
函数调用:
_buildRadioWithText(genderChangeNotifier, Gender.FEMALE, "Female"),
_buildRadioWithText(genderChangeNotifier, Gender.MALE, "Male"),
genderChangeNotifier只是一个提供程序,用于设置和获取Gender值,并在设置了Gender时通知侦听器。
final GenderNotifier genderChangeNotifier= Provider.of<GenderNotifier>(context);
当我点击GestureDetector
小部件时, onTap
的{{1}}效果很好。就像我想要的那样,它先选择然后取消选择该选项,但是在Text
小部件Radio
从未被调用的情况下。
是否知道我点击/单击onTap
小部件本身时如何取消选择?为什么包裹Radio
的{{1}}没有注册点击事件?
答案 0 :(得分:1)
未调用GestureDetector的onTap
,因为Radio小部件中的GestureDetector具有优先权。默认情况下,当两个GestureDetector争夺输入时,只有一个会“获胜”。在这种情况下,赢家就是广播电台的赢家。 This article讨论了“ GestureArenas”以及如何允许两个GestureDetector处理输入。
但是,请考虑是否允许用户取消选择单选按钮是正确的解决方案。单选按钮被设计为 not ,一旦用户选择了一个选项,便不会取消选择。您可能改为:
有关此可用性方面的更多信息,请参见this answer。