和Html input type一樣,Flutter也有他自己的input widget,像是單選框、複選框、on/off切換...
Checkbox本身不會維護任何狀態,當狀態改變時,widget會用onChange回傳狀態值,並用新的值去更新Checkbox的外觀。Checkbox
的狀態值更改時會用onChanged
回傳新的布林狀態,預設為false。當onChanged
執行回傳時會使用State.setState
的方法更新父級StatefulWidget
的狀態,以便重建更新父級。
Checkbox(
value: _value,
onChanged: (bool newValue) {
setState(() {
_value = newValue;
});
},
)
如果
onChanged
回傳值為null,則該複選框將顯示為禁用狀態。
通常Checkbox在畫面中不會只有他自己,還會伴隨著文字呈現,變成是一個帶有標籤的複選框,在Flutter裡我們不需要自己另外拼湊text或是column來做,直接使用CheckboxListTile就可以輕鬆達到這個樣式,還可以加上icon:
CheckboxListTile(
title: const Text('標籤'),
value: _value != 1,
onChanged: (bool newValue) {
setState(() { _value = newValue ? 10 : 1; });
},
secondary: const Icon(Icons.hourglass_empty),
),
和Checkbox一樣,Radio同樣不會維護任何狀態,並用onChange
回傳狀態值。當groupValue
和value
相符時,該Radio就是被選擇的狀態。
Radio(
value: MyChoices.A,
groupValue: _value,
onChanged: (MyChoices newValue) {
setState(() { _value = newValue; });
},
),
每個Radio的value我們可以使用enum來定義:
enum MyChoices { A, B }
Radio也有對應的ListTile可以拿來做成標籤選項,那就是RadioListTile
RadioListTile<MyChoices>(
title: const Text('Choice A'),
value: MyChoices.A,
groupValue: _value,
onChanged: (MyChoices newValue) { setState(() { _value = newValue; }); },
)
Switch的概念也是一樣的,這邊就不多贅述了,想了解的話可以參考官網: