What if you could let users pick one option without writing extra code to manage all the messy details?
Why Radio buttons in Flutter? - Purpose & Use Cases
Imagine you want users to pick one option from a list, like choosing their favorite fruit. Without radio buttons, you'd have to create separate buttons and write extra code to make sure only one can be selected at a time.
Manually managing selection means writing lots of code to track which button is selected, unselect others, and update the UI. This is slow, easy to mess up, and makes your app buggy and confusing.
Radio buttons handle this for you automatically. They let users pick only one option from a group, and Flutter updates the UI and state behind the scenes. This saves time and avoids mistakes.
bool option1 = false;
bool option2 = false;
// Manually toggle and untoggle optionsint selected = 1; // Use Radio widgets with groupValue and onChanged
With radio buttons, you can easily create clear, user-friendly choices where only one option is allowed, improving app usability and reducing bugs.
Think of a survey app where users must select their gender or preferred contact method. Radio buttons make these single-choice questions simple and neat.
Manual selection is complicated and error-prone.
Radio buttons automate single-choice selection.
They improve user experience and reduce code complexity.
Practice
What is the main purpose of a Radio button in Flutter?
Solution
Step 1: Understand Radio button usage
Radio buttons are designed to let users pick one choice from a small set of options.Step 2: Compare with other UI elements
Text input is for typing, images display pictures, navigation moves screens, so these are not correct.Final Answer:
To allow the user to select only one option from a group -> Option DQuick Check:
Radio button = single choice selector [OK]
- Confusing radio buttons with checkboxes
- Thinking radio buttons accept text input
- Assuming radio buttons navigate screens
Which of the following is the correct way to declare a Radio button with value 1 and groupValue 2?
Radio( ... )Solution
Step 1: Check Dart named parameter syntax
Flutter widgets use named parameters with colons, e.g., value: 1, groupValue: 2.Step 2: Validate parameter types
Values should be integers here, so strings are incorrect. Also, positional parameters are not allowed.Final Answer:
Radio(value: 1, groupValue: 2, onChanged: (val) {}) -> Option BQuick Check:
Use named parameters with colons [OK]
- Using equals sign (=) instead of colon (:)
- Passing values as strings instead of correct type
- Using positional parameters instead of named
What will be the selected radio button after this code runs?
int selected = 2;
Column(
children: [
Radio(value: 1, groupValue: selected, onChanged: (val) {}),
Radio(value: 2, groupValue: selected, onChanged: (val) {}),
Radio(value: 3, groupValue: selected, onChanged: (val) {}),
],
)Solution
Step 1: Understand groupValue and value relation
The radio button whose value matches groupValue is selected.Step 2: Check the values
groupValue is 2, so the radio with value 2 is selected.Final Answer:
The radio button with value 2 -> Option AQuick Check:
Selected = groupValue match [OK]
- Confusing value and groupValue roles
- Assuming first radio is selected by default
- Ignoring groupValue in selection
Identify the error in this Flutter code snippet for radio buttons:
int selected = 1;
Radio(
value: 1,
groupValue: selected,
onChanged: null,
)Solution
Step 1: Check onChanged parameter
onChanged must be a function to update selection; null disables interaction.Step 2: Validate other parameters
value and groupValue can be int; selected as int is correct; Radio can be inside Column.Final Answer:
onChanged should not be null to allow selection -> Option CQuick Check:
onChanged null disables radio [OK]
- Setting onChanged to null disables selection
- Confusing data types for value/groupValue
- Thinking Radio can't be inside layout widgets
You want to create a group of radio buttons for colors: Red, Green, Blue. The selected color should update the UI when tapped. Which code snippet correctly implements this behavior?
class ColorSelector extends StatefulWidget {
@override
State<ColorSelector> createState() => _ColorSelectorState();
}
class _ColorSelectorState extends State<ColorSelector> {
String selectedColor = 'Red';
@override
Widget build(BuildContext context) {
return Column(
children: [
Radio<String>(
value: 'Red',
groupValue: selectedColor,
onChanged: (val) {
setState(() {
selectedColor = val!;
});
},
),
Radio<String>(
value: 'Green',
groupValue: selectedColor,
onChanged: (val) {
setState(() {
selectedColor = val!;
});
},
),
Radio<String>(
value: 'Blue',
groupValue: selectedColor,
onChanged: (val) {
setState(() {
selectedColor = val!;
});
},
),
],
);
}
}Solution
Step 1: Check state update on tap
onChanged calls setState to update selectedColor, which triggers UI refresh.Step 2: Validate types and usage
groupValue and value are Strings, which is allowed and consistent.Step 3: Confirm UI rebuild
setState ensures the widget rebuilds with new selectedColor, updating radio selection.Final Answer:
The code correctly updates selectedColor and UI on tap -> Option AQuick Check:
setState + matching groupValue = UI update [OK]
- Forgetting to call setState to refresh UI
- Using wrong types for groupValue
- Assuming Radio buttons can't use strings
Ready to prove it?
Pass the test and this pattern moves unknown
