【Flutter】ThemeData.adaptations についてサクッと説明するよ

Dart

概要

どうも、@daiki1003です!

みなさん、ご存知の通りFlutterにはThemeDataがあります。

ThemeDataにはそれはもうたくさんのプロパティがあって、多分全部理解してる人はそう多くないはずです。

【Flutter解体新書 vol.3】ThemeData編 (頑張った...)
みなさまお久しぶりです! 解体新書vol.3を久しぶりに公開したいと思います! vol.1, 2はこちら。 なお、この記事はFlutter Advent Calendar 2022、3日目の記事となりま...

ちなみに、以前こんなブログも認めて(したためて)いるので、もしまだご覧になっていない方いらっしゃいましたら是非に。

そして、そんな複雑なThemeDataList<Adaptation<Object>> adaptationsというプロパティが追加されたのをご存知ですか?
本記事では、このadaptationsについてサクッと解説していこうと思います。

それではいってみましょー!

執筆時環境

名前バージョン
Flutter3.19.2
Dart3.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と抽象化されているところを考えると、
今後CircularProgressIndicatorCheckboxなどadaptiveコンストラクタが用意されているクラスには適宜適用されていくのではと思います。

最後に

いかがでしたでしょうか?

だんだんとかゆかったところに手が届くようになって来て良いなぁと思いつつ、若干複雑性は増したのかなとは思いました笑

誰かのお役に立てば。

Twitterフォローお願いします

「次回以降も記事を読んでみたい!」
「この辺分からなかったから質問したい!」

そんな時は、是非Twitter (@daiki1003)Instagram (@ashdik_flutter)のフォローお願いします♪

Twitterコミュニティ参加お願いします

Twitterコミュニティ「Flutter lovers」を開設しました!
参加お待ちしております😁

☕️ Buy me a coffee

また、記事がとても役に立ったと思う人は
コーヒーを奢っていただけると非常に嬉しいです!
@daiki1003

コメント

タイトルとURLをコピーしました