いわゆるラジオボタンは Radio Wdget となります
複数の選択肢のなかから1つだけ選択する場合に使われるため、Checkbox や Switch Widget とは異なる構成になっています
![[Flutter] Radio グループから1つ選択するWidget 1x1.trans - [Flutter] Radio グループから1つ選択するWidget](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
Radio Widget
例えば、Radio Widgetを2つ用意して選択します
![[Flutter] Radio グループから1つ選択するWidget 1x1.trans - [Flutter] Radio グループから1つ選択するWidget](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
Radio Widget を選択すると、
| 
					 1 2  | 
						I/flutter ( 9354): radio 2 I/flutter ( 9354): radio 1  | 
					
のようにDebug Console にプリントします
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  | 
						var selectedRadio = "radio 1"; @override Widget build(BuildContext context) {   return Column(     children: <Widget>[       Radio<String>(         value: "radio 1",         groupValue: selectedRadio,         onChanged: (value) {           setState(() {             selectedRadio = value!;             debugPrint(selectedRadio);           });         },       ),       Radio<String>(         value: "radio 2",         groupValue: selectedRadio,         onChanged: (value) {           setState(() {             selectedRadio = value!;             debugPrint(selectedRadio);           });         },       ),     ],   ); }  | 
					
 
Radio として<T>のジェネリクスを使い、データ型が抽象化されています
この例ではString型としています
Radio<String>
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						Radio<String>(   value: "radio 1",   groupValue: selectedRadio,   onChanged: (value) {     setState(() {       selectedRadio = value!;       debugPrint(selectedRadio);     });   }, ),  | 
					
Radio Widget では以下のプロパティの設定が必要です
- value: このRadio Widet の値
 - groupValue: グループ内の Radio Widget で現行選択されている値
 - onChanged: 新しく選択、setState()でgroupValueの値が更新される
 
初期値で、radio 1 を選択していたところから
radio 2 をクリックすると groupValue が “radio 2” となり
raido 1 をクリックすると groupValue が “radio 1” になります
サンプルコード
Radio Widget を3つ用意して
ListTileを使ってRadioのテキストを表示して
Option A, B, C をそれぞれ1,2,3として下段に選択したRadioを表示してみます
main.dart
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82  | 
						import 'package:flutter/material.dart'; void main() {   runApp(const MainApp()); } class MainApp extends StatelessWidget {   const MainApp({super.key});   @override   Widget build(BuildContext context) {     return MaterialApp(       home: Scaffold(         appBar: AppBar(           title: const Text('Radio button'),         ),         body: const Center(           child: RadioButton(),         ),       ),     );   } } class RadioButton extends StatefulWidget {   const RadioButton({super.key});   @override   State<RadioButton> createState() => _RadioButtonState(); } class _RadioButtonState extends State<RadioButton> {   int _selectedValue = 1;   @override   Widget build(BuildContext context) {     return Column(       children: <Widget>[         ListTile(           title: const Text('Option A'),           leading: Radio<int>(             value: 1,             groupValue: _selectedValue,             onChanged: (int? value) {               setState(() {                 _selectedValue = value!;               });             },           ),         ),         ListTile(           title: const Text('Option B'),           leading: Radio<int>(             value: 2,             groupValue: _selectedValue,             onChanged: (int? value) {               setState(() {                 _selectedValue = value!;               });             },           ),         ),         ListTile(           title: const Text('Option C'),           leading: Radio<int>(             value: 3,             groupValue: _selectedValue,             onChanged: (int? value) {               setState(() {                 _selectedValue = value!;               });             },           ),         ),         Padding(           padding: const EdgeInsets.all(16.0),           child: Text('Selected: $_selectedValue'),         ),       ],     );   } }  | 
					
実行結果
RadioListTile
Radioはラジオボタンだけですが
RadioにTitleをつけたものがRadioListTileです
ListTileを使った場合と同じようになりますが
多少コードが少なくはなります
main.dart
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76  | 
						import 'package:flutter/material.dart'; void main() {   runApp(const MainApp()); } class MainApp extends StatelessWidget {   const MainApp({super.key});   @override   Widget build(BuildContext context) {     return MaterialApp(       home: Scaffold(         appBar: AppBar(           title: const Text('RadioListTile'),         ),         body: const Center(           child: RadioButton(),         ),       ),     );   } } class RadioButton extends StatefulWidget {   const RadioButton({super.key});   @override   State<RadioButton> createState() => _RadioButtonState(); } class _RadioButtonState extends State<RadioButton> {   int _selectedValue = 1;   @override   Widget build(BuildContext context) {     return Column(       children: <Widget>[         RadioListTile(           title: const Text('Option A'),           value: 1,           groupValue: _selectedValue,           onChanged: (int? value) {             setState(() {               _selectedValue = value!;             });           },         ),         RadioListTile(           title: const Text('Option B'),           value: 2,           groupValue: _selectedValue,           onChanged: (int? value) {             setState(() {               _selectedValue = value!;             });           },         ),         RadioListTile(           title: const Text('Option C'),           value: 3,           groupValue: _selectedValue,           onChanged: (int? value) {             setState(() {               _selectedValue = value!;             });           },         ),         Padding(           padding: const EdgeInsets.all(16.0),           child: Text('Selected: $_selectedValue'),         ),       ],     );   } }  | 
					
![[Flutter] Radio グループから1つ選択するWidget 1x1.trans - [Flutter] Radio グループから1つ選択するWidget](https://akira-watson.com/wp-content/themes/simplicity2/images/1x1.trans.gif)
 
 
 
References:
Radio class
RadioListTile class