こんにちは。
flutterにはToggleButtonsクラスが用意されており、トグルボタン自体は簡単に作れますが、UIを変更しようとするとなかなか難しかったです。こちらのサイトを参考に、見た目にオシャレなトグルボタンが作れるようになったのでご紹介したいと思います。ちなみにデフォルトはこんな感じです。
それをこんな感じにします。ポイントは横一列、縦一列にしか作成できないものを縦横に作成している点、両淵にしか角丸にできないものをそれぞれのボタンの間隔を開けて角丸にしている点です。InkWellとGridViewを使用してい実現しています。アイコンの周りのボーダーや色などはBoxDecorationを使用しています。
目次
Widget呼び出し元の作成
まずは、呼び出し元を作成します。
import 'package:flutter/material.dart'; import '../baseappbar.dart'; class Home extends StatefulWidget { @override _SettingsState createState() => _SettingsState(); } class _SettingsState extends State<Home> { List<bool> isSelected = [true, false, false, false, false, false]; List<IconData> iconList = [ Icons.ac_unit, Icons.call, Icons.cake,Icons.access_alarm, Icons.backspace, Icons.calendar_today,]; @override Widget build(BuildContext context) { return Scaffold( appBar: BaseAppBar( title: Text('Home'), appBar: AppBar(), ), body: iconContent() ); }
18LでBaseAppBarという独自モジュールを利用していますが、それは前に記事にしたので、良かったら以下からどうぞ。
flutterで再利用可能なAppbarを作成する
こんにちは。 FlutterでAppbarを作成するのはすごく簡単に出来ますが、ページごとに同じ処理を書くのは良くないので再利用可能なAppbarを作成します。 Appbarとは↓こん...
22LでiconContent()でトグルボタン作成部を呼び出しているので、次の章で作成していきます。
トグルボタンの作成
iconContent() { return Container( margin: EdgeInsets.only(top: 20, bottom: 20, left: 20, right: 20), height: double.infinity, width: double.infinity, child: Ink( color: Colors.white, child: GridView.count( primary: true, crossAxisCount: 3, mainAxisSpacing: 10, crossAxisSpacing: 10, childAspectRatio: 1, children: List.generate(isSelected.length, (index) { return InkWell( onTap: () { setState(() { isSelected[index] = !isSelected[index]; }); }, child: Ink( decoration: BoxDecoration( color: isSelected[index] ? Colors.redAccent : Colors.white, borderRadius: BorderRadius.circular(8), border: Border.all( color: Colors.redAccent, width: 3, ) ), child: Icon(iconList[index],size:40, color: isSelected[index] ? Colors.white : Colors.redAccent), ) ); }), ), ), ); }
10-13Lでボタンの大きさや要素間の間隔などを調整できます。このトグルボタンは複数選択可の状態にしてありますが、1つだけの選択状態にしたい場合は、17LのsetStateを変更します。変更方法はこちらの公式マニュアルを見てもらえばいいかと思います。
選択、非選択で色を反転させるようにしているので、「color: isSelected[index] ? Colors.redAccent : Colors.white,」こんな感じで選択状態を確認しています。
コメント