如何在Flutter中更改单选按钮的非活动颜色?

11

我在ListTile内部有一个Radio按钮。当点击ListTile时,我会改变Radio的值。但我不希望单选按钮是可点击的,因此我没有提供onChanged回调函数:

ListTile(
  onTap: () => onChanged(template.id),
  leading: Radio(
    value: template.id,
    groupValue: checkedId,
  )
  ...
)

这样做,Radio 就变成了“非活动”状态,并将其颜色变为灰色。 Radio 有一个 activeColor 属性,但没有用于非活动状态的属性。

如果我为 RadioonChanged 属性提供一个虚拟函数,则它会变为活动状态,但问题在于我不希望它可以点击,我只想让 ListTile 可以点击(原因是我想能够取消选择 Radio)。

此外,我只想更改这些特定 Radio 按钮的非活动颜色,而不是整个应用程序的颜色。

当前结果:

演示 1

使用 onChange 的结果(无法取消选中 Radio):

演示 2

3个回答

39

Radio 使用 ThemeDataunselectedWidgetColor。 如果您只需要针对特定屏幕上的几个单选按钮更改此颜色,请将它们包装在 Theme 小部件中以覆盖颜色:

Theme(
  data: Theme.of(context).copyWith(
    unselectedWidgetColor: Colors.red,
    disabledColor: Colors.blue
  ),
  child: Column(
    children: <Widget>[
      ListTile(
        onTap: () => setState(() => value = 0),
        leading: Radio(
          value: 0,
          groupValue: value,
          onChanged: (v) => setState(() => value = v),
        )
      ),
      ListTile(
        onTap: () => setState(() => value = 1),
        leading: Radio(
          value: 1,
          groupValue: value,
          onChanged: (v) => setState(() => value = v),
        )
      ),
    ],
  ),
)

如果在Radio中没有传递onChanged回调函数,它会被解释为禁用状态(这对许多默认材料小部件有效)。


这将使未选中的Radio也变成蓝色。以下是修复方法:disabledColor:template.ai == checkedAi ? Colors.blue : null,谢谢。 - HTMHell
有没有可能改变单选按钮的背景颜色? https://stackoverflow.com/questions/64166407/flutter-how-to-change-radio-background-color/64167054?noredirect=1#comment113470539_64167054 - thanhbinh84

4

您还可以设置fillColor属性,它解决了多个单选按钮状态的颜色。在这种情况下,它会为所有状态返回Colors.blue

Radio(
          fillColor: MaterialStateColor.resolveWith((states) => Colors.blue),
          value: 1,
          groupValue: _optionValue,
          onChanged: changeValue,
        )

-1

更改单选按钮未选中的颜色:

unselectedWidgetColor: Colors.green,

更改单选按钮选择的颜色:

toggleableActiveColor: Colors.green,

请提供您所提供的代码的完整示例。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接