颤动切换收音机小部件

时间:2020-06-30 14:09:23

标签: flutter radio-button toggle

我正在使用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}}没有注册点击事件?

1 个答案:

答案 0 :(得分:1)

未调用GestureDetector的onTap,因为Radio小部件中的GestureDetector具有优先权。默认情况下,当两个GestureDetector争夺输入时,只有一个会“获胜”。在这种情况下,赢家就是广播电台的赢家。 This article讨论了“ GestureArenas”以及如何允许两个GestureDetector处理输入。

但是,请考虑是否允许用户取消选择单选按钮是正确的解决方案。单选按钮被设计为 not ,一旦用户选择了一个选项,便不会取消选择。您可能改为:

  • 提供第三个“我不想说”选项
  • 使用可切换按钮代替广播组
  • 使用下拉菜单代替广播组

有关此可用性方面的更多信息,请参见this answer