如何在Flutter中更改收音机的无效颜色?

时间:2019-12-05 12:17:34

标签: user-interface flutter dart radio-button

我在Radio中有一个ListTile按钮。单击ListTile时,将更改Radio的值。我不希望该收音机可以点击,所以我不提供onChanged回调:

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

这样做,Radio变为“无效”,并将其颜色更改为灰色。 Radio具有activeColor属性,但不处于活动状态。

如果我为Radio的{​​{1}}属性提供了一个伪函数-它变为活动状态,但是问题是我不希望它可被单击,所以我希望onChanged只能单击(原因是-我想取消选中ListTile

此外,我只想更改那些特定的Radio按钮的无效颜色,而不是整个应用程序。

当前结果:

Demo 1

Radio的结果(单击收音机时,我无法取消选中它):

Demo 2

2 个答案:

答案 0 :(得分:1)

您必须更改unselectedWidgetColor中的ThemeData。如果您只需要在页面中的少数几个收音机中执行此操作,则可以将它们包装在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),
        )
      ),
    ],
  ),
)

如果您不将onChanged传递给Radio,它将被解释为已禁用(这适用于许多默认的材质小部件)。

答案 1 :(得分:0)

您还可以设置 fillColor 属性,它可以解析多个无线电状态的颜色。在这种情况下,它为所有状态返回 Colors.blue

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