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:

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

Since the radio button contains a label, we can't use the Radio button. Instead, we are going to create a custom class that can be used the create the options called MyRadioOption . Inspired by Flutter's Radio widget, the class has value , groupValue , and onChanged properties.
Use Radio's toggleable property. Documentation Set to true if this radio button is allowed to be returned to an indeterminate state by selecting it again when selected.
the solution is to declare bool value evaluate in my case then on button click make that value true and setstate with that value and on the onChanged prop of the RadioListTile add this code: onChanged: (value) => evaluate ? null : value = 0, hope this was helpful!
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With