概要
どうも、@daiki1003です!みなさまお久しぶりです!
解体新書vol.3を久しぶりに公開したいと思います!
vol.1, 2はこちら。
なお、この記事はFlutter Advent Calendar 2022、3日目の記事となります。
すごく長いので、辞書的な感じで使っていただけると幸いです!
また、各種サンプルはどこが指定されているか分かりやすくするために指定しており
デザイン的観点は全くないのでその点はご承知おきくださいませ笑
最後に、ThemeData
内のコメントにも書いているように、Deprecated
なプロパティを除いてアルファベット順で表記しています。
今回のサンプルプロジェクトは下記にあるので、手元でコードをコピペしたりして遊んでみてくださいね!
では行ってみましょー!
執筆時環境
Flutter 3.3.8 • channel stable • https://github.com/flutter/flutter.git Framework • revision 52b3dc25f6 (3 weeks ago) • 2022-11-09 12:09:26 +0800 Engine • revision 857bd6b74c Tools • Dart 2.18.4 • DevTools 2.15.0
bool? applyElevationOverlayColor
ダークテーマの際にtrue
になっており、elevation
の代わりにカードの色などを調節してくれるようになるフラグです。
NoDefaultCupertinoThemeData? cupertinoOverrideTheme
MaterialApp
では、theme
にはThemeData
しか指定できません。
しかし、iOSのUIであるCupertino
系ウィジェットはThemeData
ではなくCupertinoThemeData
で指定する必要があります。
その際に、こちらのプロパティを使って指定します。
Iterable? extensions
Flutter 3
から使えるようになったThemeExtension
を扱うためのプロパティです。
詳しい説明はThemeExtension
の説明ブログに譲ります。
InputDecorationTheme? inputDecorationTheme
InputDecorationTheme( filled: true, fillColor: Colors.red[100], isDense: true, contentPadding: EdgeInsets.symmetric(horizontal: 24, vertical: 16), hintStyle: TextStyle(color: Colors.red), ),
デフォルト | テーマ変更後 |
> |
TextField
など入力系のウィジェットのテーマを指定できます。
MaterialTapTargetSize? materialTapTargetSize
materialTapTargetSize: materialTapTargetSize.shrinkWrap,
デフォルト | テーマ変更後 |
全体的に描画範囲が縮まっていることがわかりますね。
PageTransitionsTheme? pageTransitionsTheme
{ TargetPlatform.iOS: FadeUpwardsPageTransitionsBuilder(), }, ),
ページ遷移のアニメーションを変更します。
などが指定できます。
TargetPlatform? platform
iPhone Simulator
などでAndroid
のテーマ確認をする際に、
platform: TargetPlatform.android,
とすることで、確認すると言ったことが出来ます。
device_previewパッケージなんかもすごく便利ですが、サクッと確認する場合には圧倒的にこちらが楽ですね。
ScrollbarThemeData? scrollbarTheme
const ScrollbarThemeData( thumbColor: MaterialStatePropertyAll(Colors.yellow), trackColor: MaterialStatePropertyAll(Colors.black), trackBorderColor: MaterialStatePropertyAll(Colors.red), thumbVisibility: MaterialStatePropertyAll(true), trackVisibility: MaterialStatePropertyAll(true), ),
デフォルト | テーマ変更後 |
InteractiveInkFeatureFactory? splashFactory
ボタンなどを押した際に、リップルエフェクトが発生しますがこれに関する設定を一括で行えます。NoSplash.splashFactory
で抑制したり、InkSparkle.splashFactory
などで少し速いリップルエフェクトなどを指定できます。
bool? useMaterial3
useMaterial3: true,
デフォルト | テーマ変更後 |
その名の通り、 Material 3
を適用するかどうかのフラグとなります。
相当見た目変わりますね。
VisualDensity? visualDensity
VisualDensity.compact,
デフォルト | テーマ変更後 |
style
プロパティなどで、visualDensity
を指定出来るウィジェットのpadding
を微調整出来ます。
Color? backgroundColor
ColorScheme
による指定が推奨されています。
後にColor
による指定やprimarySwatch
などは消すそうです。
Color? bottomAppBarColor
ColorScheme
による指定が推奨されています。
Brightness? brightness
ColorScheme
による指定が推奨されています。
Color? canvasColor
ColorScheme
による指定が推奨されています。
Color? cardColor
ColorScheme
による指定が推奨されています。
ColorScheme? colorScheme
ColorScheme
による指定が推奨されています。
Color? colorSchemeSeed
ColorScheme
による指定が推奨されています。
Color? dialogBackgroundColor
ColorScheme
による指定が推奨されています。
Color? disabledColor
ColorScheme
による指定が推奨されています。
Color? dividerColor
ColorScheme
による指定が推奨されています。
Color? errorColor
ColorScheme
による指定が推奨されています。
Color? focusColor
ColorScheme
による指定が推奨されています。
Color? highlightColor
ColorScheme
による指定が推奨されています。
Color? hintColor
ColorScheme
による指定が推奨されています。
Color? hoverColor
ColorScheme
による指定が推奨されています。
Color? indicatorColor
ColorScheme
による指定が推奨されています。
Color? primaryColor
ColorScheme
による指定が推奨されています。
Color? primaryColorDark
ColorScheme
による指定が推奨されています。
Color? primaryColorLight
ColorScheme
による指定が推奨されています。
MaterialColor? primarySwatch
ColorScheme
による指定が推奨されています。
Color? scaffoldBackgroundColor
ColorScheme
による指定が推奨されています。
Color? secondaryHeaderColor
ColorScheme
による指定が推奨されています。
Color? selectedRowColor
ColorScheme
による指定が推奨されています。
Color? shadowColor
ColorScheme
による指定が推奨されています。
Color? splashColor
ColorScheme
による指定が推奨されています。
Color? toggleableActiveColor
ColorScheme
による指定が推奨されています。
Color? unselectedWidgetColor
ColorScheme
による指定が推奨されています。
String? fontFamily
textTheme
やprimaryTextTheme
の設定に用いられています。
IconThemeData? iconTheme
const IconThemeData( color: Colors.red, opacity: 0.3, ),
デフォルト | テーマ変更後 |
Icon
やIconButton
はもちろんのこと、PopupMenuButton
のchild
未指定時の
三点リーダにも適用されているようです。
IconThemeData? primaryIconTheme
primaryColor
の上に表示するアイコン用のテーマです。leading
やactions
の表示の際に、サイズが参照されていたりもします。
TextTheme? primaryTextTheme
TextTheme( subtitle1: TextStyle( fontSize: 10, color: Colors.red, ), )
primaryColor
の上に表示するテキスト用のテーマです。CircleAvatar
のchild
にText
を指定した際などに使われたりしていますね。
TextTheme? textTheme
その名の通り、Text
のテーマです。
Typography? typography
内部的に、上記 textTheme
を生成するために使用されています。Typography
クラスには、Material 3
に対応したTypography.material2021
や
それ以前であるTypography.material2014
などのコンストラクタを持っています。
AppBarTheme? appBarTheme
const AppBarTheme( backgroundColor: Colors.blueGrey, elevation: 0, ),
デフォルト | テーマ変更後 |
MaterialBannerThemeData? bannerTheme
MaterialBannerThemeData( padding: EdgeInsets.all(20), backgroundColor: Colors.grey[200], ),
デフォルト | テーマ変更後 |
BottomAppBarTheme? bottomAppBarTheme
BottomAppBarTheme( color: Colors.red, )
デフォルト | テーマ変更後 |
FAB
と相性の良いBottomAppBar
のためのテーマです。
BottomNavigationBarThemeData? bottomNavigationBarTheme
BottomNavigationBarThemeData( backgroundColor: Colors.black12, elevation: 0, unselectedIconTheme: IconThemeData( size: 16, ), unselectedLabelStyle: TextStyle( fontSize: 10, ), selectedIconTheme: IconThemeData( size: 24, color: Colors.red, ), selectedLabelStyle: TextStyle( fontSize: 16, ), selectedItemColor: Colors.red, ),
デフォルト | テーマ変更後 |
画面下部のBottomNavigationBar
のためのテーマです。
BottomSheetThemeData? bottomSheetTheme
const BottomSheetThemeData( backgroundColor: Colors.red, ),
デフォルト | テーマ変更後 |
BottomSheet
のテーマです。showModalBottomSheet
を用いて表示した際は、modalBackgroundColor
やmodalElevation
が使用されます。
ButtonBarThemeData? buttonBarTheme
const ButtonBarThemeData( mainAxisSize: MainAxisSize.min, buttonTextTheme: ButtonTextTheme.primary, overflowDirection: VerticalDirection.up, ),
デフォルト | テーマ変更後 |
ButtonBar
のテーマを指定できます。
ButtonThemeData? buttonTheme
各種ボタンの色などのテーマを指定するものですが、廃止予定です。
後述する、elevatedButtonTheme
など個別で指定しましょう。
CardTheme? cardTheme
CardTheme( color: Colors.red, elevation: 12, ),
デフォルト | テーマ変更後 |
Card
のテーマを指定します。
カード自体の色や影の色やサイズを指定することができます。
CheckboxThemeData? checkboxTheme
CheckboxThemeData( fillColor: MaterialStatePropertyAll(Colors.red[100]), checkColor: MaterialStatePropertyAll(Colors.red) ),
デフォルト | テーマ変更後 |
Checkbox
のテーマを指定します。
ChipThemeData? chipTheme
ChipThemeData( backgroundColor: Colors.red[100], disabledColor: Colors.green, selectedColor: Colors.blue, showCheckmark: true, checkmarkColor: Colors.amber, ),
デフォルト | テーマ変更後 |
各種Chip
と名のつくクラスのテーマを指定することができます。
一部のChip
にしか対応していないプロパティなどもあるので注意が必要です。
DataTableThemeData? dataTableTheme
DataTableThemeData( columnSpacing: 120, headingRowColor: MaterialStatePropertyAll(Colors.red), headingRowHeight: 32, dataRowColor: MaterialStatePropertyAll(Colors.red), ),
デフォルト | テーマ変更後 |
DatTable
のテーマを指定することができます。DataTablee
を生成する際には、columns
とrows
なのに、テーマはheaderRow
とdataRow
なのが少し気になりますね笑
DialogTheme? dialogTheme
DialogTheme( backgroundColor: Colors.red[100], elevation: 0, titleTextStyle: TextStyle(color: Colors.blue), contentTextStyle: TextStyle(color: Colors.green), ),
デフォルト | テーマ変更後 |
SimpleDialog
やAlertDialog
のテーマを指定することができます。
DividerThemeData? dividerTheme
DividerThemeData( color: Colors.red[300], thickness: 4, indent: 16, endIndent: 16, ),
デフォルト | テーマ変更後 |
Divider
のテーマを指定することができます。
DrawerThemeData? drawerTheme
DrawerThemeData( backgroundColor: Colors.red[100], scrimColor: Colors.blue[300], elevation: 0, ),
デフォルト | テーマ変更後 |
Drawer
を開いた際のテーマを指定することができます。
ElevatedButtonThemeData? elevatedButtonTheme
ElevatedButtonThemeData( style: ElevatedButton.styleFrom( backgroundColor: Colors.red[100], foregroundColor: Colors.red, disabledBackgroundColor: Colors.grey[100], disabledForegroundColor: Colors.grey, textStyle: const TextStyle(fontSize: 24), elevation: 1, ), ),
デフォルト | テーマ変更後 |
ElevatedButton
のテーマを指定することができます。
ExpansionTileThemeData? expansionTileTheme
ExpansionTileThemeData( backgroundColor: Colors.red[100], collapsedBackgroundColor: Colors.red, iconColor: Colors.black, collapsedIconColor: Colors.white, textColor: Colors.black, collapsedTextColor: Colors.white, ),
デフォルト | テーマ変更後 |
ExpantionTile
のテーマを指定することができます。
FloatingActionButtonThemeData? floatingActionButtonTheme
FloatingActionButtonThemeData( backgroundColor: Colors.red[100], foregroundColor: Colors.red, elevation: 1, iconSize: 16, ),
デフォルト | テーマ変更後 |
FloatingActionButton
のテーマを指定することができます。
ListTileThemeData? listTileTheme
ListTileThemeData( iconColor: Colors.red, horizontalTitleGap: 50, contentPadding: EdgeInsets.all(10), tileColor: Colors.red[100], textColor: Colors.red, ),
デフォルト | テーマ変更後 |
ListTile
のテーマを指定することができます。
NavigationBarThemeData? navigationBarTheme
NavigationBarThemeData( height: 80, backgroundColor: Colors.red[100], indicatorColor: Colors.red, indicatorShape: const StadiumBorder(), labelTextStyle: const MaterialStatePropertyAll(TextStyle( fontSize: 12, color: Colors.red, )), iconTheme: MaterialStateProperty.resolveWith((states) { if (states.contains(MaterialState.selected)) { return const IconThemeData( color: Colors.white, ); } return const IconThemeData( color: Colors.red, ); }), ),
デフォルト | テーマ変更後 |
NavigationBar
のテーマを指定することができます。
NavigationRailThemeData? navigationRailTheme
NavigationRailThemeData( backgroundColor: Colors.red[100], elevation: 10, unselectedLabelTextStyle: const TextStyle(color: Colors.red), unselectedIconTheme: const IconThemeData(color: Colors.red), selectedLabelTextStyle: const TextStyle( fontSize: 24, color: Colors.white, ), selectedIconTheme: const IconThemeData( color: Colors.white, ), useIndicator: true, indicatorColor: Colors.amber, labelType: NavigationRailLabelType.all, minWidth: 100, ),
デフォルト | テーマ変更後 |
OutlinedButtonThemeData? outlinedButtonTheme
OutlinedButtonThemeData( style: OutlinedButton.styleFrom( backgroundColor: Colors.red[100], foregroundColor: Colors.red, disabledBackgroundColor: Colors.grey[100], disabledForegroundColor: Colors.grey, textStyle: const TextStyle(fontSize: 24), elevation: 1, ), ),
デフォルト | テーマ変更後 |
OutlinedButton
のテーマを指定できます。
PopupMenuThemeData? popupMenuTheme
PopupMenuThemeData( color: Colors.red[100], textStyle: const TextStyle( fontSize: 24, color: Colors.red, ), ),
デフォルト | テーマ変更後 |
PopupMenuButton
やPopupMenuItem
のテーマを指定できます。
ProgressIndicatorThemeData? progressIndicatorTheme
ProgressIndicatorThemeData( color: Colors.red, linearTrackColor: Colors.green, linearMinHeight: 8, circularTrackColor: Colors.amber, refreshBackgroundColor: Colors.blue, ),
デフォルト | テーマ変更後 |
CircularProgressIndicator
やLinearProgressIndicator
のテーマを指定できます。
ただし、ThemeData
はMaterial UI
が対象なので、iOS端末においてCircularProgressIndicator.adaptive
などで
表示した場合は適用されません。
RadioThemeData? radioTheme
RadioThemeData( fillColor: MaterialStatePropertyAll(Colors.red), )
デフォルト | テーマ変更後 |
Radio
やRadioListTile
などのテーマを指定できます。
SliderThemeData? sliderTheme
SliderThemeData( trackHeight: 8, activeTrackColor: Colors.blue[100], inactiveTrackColor:Colors.red[100], thumbColor: Colors.red, ),
デフォルト | テーマ変更後 |
Slider
のテーマを指定できます。
SnackBarThemeData? snackBarTheme
SnackBarThemeData( backgroundColor: Colors.red[100], contentTextStyle: TextStyle(color: Colors.red), actionTextColor: Colors.black, ),
デフォルト | テーマ変更後 |
Snackbar
のテーマを指定できます。
SwitchThemeData? switchTheme
SwitchThemeData( thumbColor: MaterialStatePropertyAll(Colors.red), trackColor: MaterialStatePropertyAll(Colors.red[100]), ),
デフォルト | テーマ変更後 |
Switch
のテーマを指定できます。
ただし、ThemeData
はMaterial UI
が対象なので、iOS端末においてSwitch.adaptive
などで
表示した場合は適用されません。
TabBarTheme? tabBarTheme
TabBarTheme( labelColor: Colors.red, unselectedLabelColor: Colors.green, indicator: BoxDecoration( color: Colors.red[100], borderRadius: BorderRadius.circular(16), ), labelPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), indicatorSize: TabBarIndicatorSize.tab, ),
デフォルト | テーマ変更後 |
TabBar
のテーマを指定できます。
TextButtonThemeData? textButtonTheme
TextButtonThemeData( style: TextButton.styleFrom( backgroundColor: Colors.red[100], foregroundColor: Colors.red, disabledForegroundColor: Colors.blue, disabledBackgroundColor: Colors.blue[100], textStyle: const TextStyle(fontSize: 24), padding: const EdgeInsets.all(20), ), ),
デフォルト | テーマ変更後 |
TextSelectionThemeData? textSelectionTheme
TextSelectionThemeData( selectionColor: Colors.red[100], selectionHandleColor: Colors.green, ),
デフォルト | テーマ変更後 |
SelectableText
などで、テキストを範囲選択した際のセレクタのテーマを指定できます。
TimePickerThemeData? timePickerTheme
TimePickerThemeData( backgroundColor: Colors.red[100], hourMinuteTextColor: Colors.red, hourMinuteColor: Colors.blue[100], dayPeriodColor: Colors.green[100], dayPeriodTextColor: Colors.green, dialBackgroundColor: Colors.blue[100], dialHandColor: Colors.blue, dialTextColor: Colors.blue, entryModeIconColor: Colors.yellow, hourMinuteShape: const StadiumBorder(), hourMinuteTextStyle: const TextStyle(fontSize: 24), dayPeriodTextStyle: const TextStyle(fontSize: 20), helpTextStyle: const TextStyle(fontSize: 20), ),
デフォルト | テーマ変更後 |
showTimePicker
で出るピッカーのテーマを指定できます。
かなり色々自由に指定できそうですね。
ToggleButtonsThemeData? toggleButtonsTheme
ToggleButtonsThemeData( color: Colors.blue, fillColor: Colors.red[100], borderColor: Colors.red[100], selectedBorderColor: Colors.red, borderRadius: BorderRadius.circular(16), selectedColor: Colors.red, disabledColor: Colors.black, disabledBorderColor: Colors.black, borderWidth: 8, ),
デフォルト | テーマ変更後 |
TooltipThemeData? tooltipTheme
TooltipThemeData( height: 64, padding: const EdgeInsets.all(10), verticalOffset: 40, decoration: BoxDecoration( color: Colors.red[100], ), textStyle: const TextStyle( fontWeight: FontWeight.bold, color: Colors.red, ), ),
デフォルト | テーマ変更後 |
各種ウィジェットのTooltip
のテーマを指定できます。
ここから下はDeprecated
となっています。
Color? accentColor
その名の通り、アクセント色を指定することが出来ました。ColorScheme.secondary
を代わりに使ってください。
Brightness? accentColorBrightness
現在使われていません。
TextTheme? accentTextTheme
現在使われていません。
IconThemeData? accentIconTheme
現在使われていません。
Color? buttonColor
現在使われていません。
bool? fixTextFieldOutlineLabel
指定せずともデフォルトで有効です。
Brightness? primaryColorBrightness
現在使われていません。
AndroidOverscrollIndicator? androidOverscrollIndicator
useMaterial3
を使うか、ScrollBehavior.buildOverscrollIndicator
を使ってください。
終わりに
いかがでしたでしょうか?
Theme
は開発途中から入れるには影響範囲が大きすぎて入れづらいですよね。
どこが変化するのか正しく把握して最初から設計しておきたいですね!
僕も頑張ります笑
もし、間違いがあったらTwitterまで指摘などをお願いします!
頑張ったねって少しでも思っていただけたら↓からコーヒーを少し奢っていただけると嬉しいです!
もちろん、強制ではありません笑
Twitterフォローお願いします
「次回以降も記事を読んでみたい!」「この辺分からなかったから質問したい!」
そんな時は、是非Twitter (@daiki1003)やInstagram (@ashdik_flutter)のフォローお願いします♪
Twitterコミュニティ参加お願いします
Twitterコミュニティ「Flutter lovers」を開設しました!参加お待ちしております😁
☕️ Buy me a coffee
また、記事がとても役に立ったと思う人はコーヒーを奢っていただけると非常に嬉しいです!
コメント