简体   繁体   中英

How to change radio's inactive color in Flutter?

I have a Radio button inside a ListTile . When the ListTile is clicked, I change the Radio 's value. I don't want the radio to be clickable, so I don't provide an onChanged callback:

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

Doing that, the Radio becomes "inactive" and changes it's color to grey. The Radio has an activeColor property, but not for inactive.

If I provide a dummy function to Radio 's onChanged property - it becomes active, but the problem is I don't want it to be clickable, I want the ListTile to be clickable only (the reason is - I want to be able to uncheck the Radio )

Also, I only want to change the inactive color of those specific Radio buttons, and not for the whole app.

Current Result:

演示 1

Result with onChange (I can't uncheck the radio when clicking on it):

演示 2

Radio uses unselectedWidgetColor of ThemeData . If you need to change it only for a few radios on a specific screen, wrap them in Theme widget to override a color:

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),
        )
      ),
    ],
  ),
)

If no callback passed in onChanged to Radio , it is interpreted as disabled (this works for many default material widgets).

You can also set the fillColor propery, it resolves a color for multiple radio states. In this case, it returns Colors.blue for all states.

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

To change the radio unselected color:

unselectedWidgetColor: Colors.green,

To change radio selected color:

toggleableActiveColor: Colors.green,

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM