【问题标题】:Flutter toggle Radio widgetFlutter 切换收音机小部件
【发布时间】:2020-10-20 20:53:10
【问题描述】:

我正在使用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);

当我点击Text 小部件时,GestureDetectoronTap 效果很好。它会按照我的意愿选择然后取消选择该选项,但如果 Radio 小部件 onTap 永远不会被调用。


知道当我点击/单击 Radio 小部件本身时如何取消选择吗?为什么包装RadioGestureDetector 不注册点击事件?

【问题讨论】:

    标签: flutter radio-button toggle


    【解决方案1】:

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

    但是,请考虑允许用户取消选择单选按钮是否是正确的解决方案。单选按钮不会在用户选择选项后被取消选择。您可以改为:

    • 提供第三种“我不想说”选项
    • 使用可切换按钮而不是单选组
    • 使用下拉菜单而不是单选组

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

    【讨论】:

    • 你认为我应该像 Facebook 那样为性别类型其他/自定义创建一个选项吗?或者提供一个而不是说选项就足够了?还是两者都用?我知道这是一个偏好问题,但这对我来说很奇怪。
    • 好吧,首先问问自己为什么需要用户的性别。您使用数据的方式可能会指导您的决定。你甚至需要数据吗?你是在问,所以你知道使用什么代词(他/她/他们)?如果您不需要数据,您可以完全消除该字段并简化您的 UI。如果你需要用代词来指代他们,可以直接问他们喜欢哪个代词。我认为如果您确实选择给他们一个性别选项列表,包括其他/自定义选项是有用的,因此您不会强迫任何人选择对他们没有意义的选项。
    猜你喜欢
    • 2012-06-23
    • 2021-01-14
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2020-12-26
    • 2020-12-16
    • 2021-10-07
    相关资源
    最近更新 更多