概要
どうも、@daiki1003です!みなさん、ご存知の通りFlutter
にはThemeData
があります。
ThemeData
にはそれはもうたくさんのプロパティがあって、多分全部理解してる人はそう多くないはずです。
ちなみに、以前こんなブログも認めて(したためて)いるので、もしまだご覧になっていない方いらっしゃいましたら是非に。
そして、そんな複雑なThemeData
にList<Adaptation<Object>> adaptations
というプロパティが追加されたのをご存知ですか?
本記事では、このadaptations
についてサクッと解説していこうと思います。
それではいってみましょー!
執筆時環境
名前 | バージョン |
Flutter | 3.19.2 |
Dart | 3.3.0 |
筆者環境
Switch.adaptive
突然ですが、Switch.adaptive
コンストラクタをご存知でしょうか?
こんな感じで各OSフレンドリーなSwitch
を表示することができる優れものです。
ですが、ちょっとだけ困ったことがあります。
見た目このままに、着色はしたい事って結構あるんですよ。
特にアプリのテーマとかに沿って。
では、テーマを指定していきましょう。
ThemeData( ... switchTheme: SwitchThemeData( thumbColor: MaterialStateProperty.resolveWith((states) { if (states.contains(MaterialState.selected)) { return Colors.white; } return null; }), trackColor: MaterialStateProperty.resolveWith((states) { if (states.contains(MaterialState.selected)) { return Colors.amber; } return null; }), ), )
えー、見事なまでにガン無視なんですけど。
もう我々は諦めるしかないのでしょうか。
いいえ、そんなことはありません。
Switch.adaptive( activeColor: activeColor, trackColor: MaterialStateProperty.all(trackColor), value: state.value, onChanged: (value) => state.value = value, ),
こんな感じでプロパティを指定することで効かせることは可能です。
でも、ちょっとねぇ。。。笑
せっかくThemeData
使ってるのに結局毎回色指定するん?って言う。
やっぱり我々は諦めるしかないのでしょうか?
今までは諦める必要がありました。
そんなあなたに、ThemeData.adaptations
です!
期待の新星adaptationsとは?
まずは、実装例を見てみましょう。
return ThemeData( ... adaptations: const [ _SwitchThemeAdaptation(), ], ... ); class _SwitchThemeAdaptation extends Adaptation<SwitchThemeData> { const _SwitchThemeAdaptation(); @override SwitchThemeData adapt(ThemeData theme, SwitchThemeData defaultValue) { switch (theme.platform) { case TargetPlatform.android: case TargetPlatform.fuchsia: case TargetPlatform.linux: case TargetPlatform.windows: return defaultValue; case TargetPlatform.iOS: case TargetPlatform.macOS: return SwitchThemeData( trackColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.selected)) { return Colors.amber; } return null; }), ); } } }
いけてますね!
今後の展望
うおおおおおおおおおおお、これがあればあれもこれも出来てしまうではないか!!!!!
と思われた方、申し訳ありません。
実は、このAdaptation
、現状Switch.adaptive
にしか適用できません。
が、Adaptation
と抽象化されているところを考えると、
今後CircularProgressIndicator
やCheckbox
などadaptive
コンストラクタが用意されているクラスには適宜適用されていくのではと思います。
最後に
いかがでしたでしょうか?
だんだんとかゆかったところに手が届くようになって来て良いなぁと思いつつ、若干複雑性は増したのかなとは思いました笑
誰かのお役に立てば。Twitterフォローお願いします
「次回以降も記事を読んでみたい!」「この辺分からなかったから質問したい!」
そんな時は、是非Twitter (@daiki1003)やInstagram (@ashdik_flutter)のフォローお願いします♪
Twitterコミュニティ参加お願いします
Twitterコミュニティ「Flutter lovers」を開設しました!参加お待ちしております😁
☕️ Buy me a coffee
また、記事がとても役に立ったと思う人はコーヒーを奢っていただけると非常に嬉しいです!
コメント