ON/OFF機能を実装したい時はSwitch Widget が利用できます
Switch Widget
トグルスイッチ、つまりONに倒れるか、OFFに倒れるどちらかの値を持ちます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class _TestSwitchState extends State<TestSwitch> { bool flg = true; @override Widget build(BuildContext context) { return Switch( // This bool value toggles the switch. value: flg, onChanged: (bool value) { // This is called when the user toggles the switch. setState(() { flg = value; }); }, ); } } |
Swith の基本的なプロパティは
- value: ブール値、オンではtrue、オフでは false を表します
- onChanged: コールバック関数で、オンからオフ、あるいはオフからオンに更新される
Switchの他のプロパティとして
1 2 3 4 5 6 7 8 9 10 11 12 |
Switch( value: flg, activeColor: Colors.red, activeTrackColor: Colors.orange, inactiveThumbColor: Colors.black, inactiveTrackColor: Colors.lightGreen, onChanged: (bool value) { setState(() { flg = value; }); }, ), |
- activeColor: Switch ON でのツマミの色
- activeThumbImage: ツマミをアイコンにできる
- activeTrackColor: ONでのトラック背景色
- inactiveThumbColor: Switch OFF でのツマミの色
- inactiveTrackColor: OFFでのトラック背景色
尚、nullは無効となり、表示上は非活性化されます
サンプルコード
以上をまとめてみます
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 |
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( theme: ThemeData(useMaterial3: true), home: Scaffold( appBar: AppBar(title: const Text('Switch Widget')), body: const Center( child: TestSwitch(), ), ), ); } } class TestSwitch extends StatefulWidget { const TestSwitch({super.key}); @override State<TestSwitch> createState() => _TestSwitchState(); } class _TestSwitchState extends State<TestSwitch> { bool flg = true; @override Widget build(BuildContext context) { return Column( children: <Widget>[ Switch( value: flg, activeColor: Colors.red, activeTrackColor: Colors.orange, inactiveThumbColor: Colors.black, inactiveTrackColor: Colors.lightGreen, onChanged: (bool value) { setState(() { flg = value; }); }, ), Padding( padding: const EdgeInsets.all(16.0), child: Text('Selected Value: $flg'), ), ] ); } } |
実行結果
SwitchListTile
Switch にテキスト、ListTileを追加したWidgetです
Iconなども設定しました
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 |
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( theme: ThemeData(useMaterial3: true), home: Scaffold( appBar: AppBar(title: const Text('SwitchListTile')), body: const Center( child: TestSwitch(), ), ), ); } } class TestSwitch extends StatefulWidget { const TestSwitch({super.key}); @override State<TestSwitch> createState() => _TestSwitchState(); } class _TestSwitchState extends State<TestSwitch> { bool flg = true; @override Widget build(BuildContext context) { return Column( children: <Widget>[ SwitchListTile( title: const Text('Toggle switch'), subtitle: const Text('Switch Listtile'), secondary: const Icon(Icons.notifications), value: flg, activeColor: Colors.red, activeTrackColor: Colors.orange, inactiveThumbColor: Colors.black, inactiveTrackColor: Colors.lightGreen, onChanged: (bool value) { setState(() { flg = value; }); }, ), Padding( padding: const EdgeInsets.all(16.0), child: Text('Selected Value: $flg'), ), ] ); } } |
References:
Switch class
SwitchListTile class