質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Q&A

解決済

1回答

971閲覧

Flutter : darkmodeがある時の背景色と文字色のコントラストの指定方法について

moriman

総合スコア615

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

0グッド

0クリップ

投稿2022/03/29 03:04

編集2022/03/29 03:05

FlutterでContainerの中にTextがあるようなケースです。

Container( child:Text('test'), )

ここでContainerの背景色を指定します。

Container( color:Colors.blue[100], child:Text('test'), )

ライトテーマ時の文字色がデフォルトの黒、
Containerの背景色がColors.blue[100]
で、これでライトテーマ時に問題無いデザインである、ということにします。

ただ、ダークテーマに切り替えると文字色が白色になるのですが、
指定した背景色はColors.blue[100]のままなので、背景色と文字色のコントラストが不明瞭でかなり文字が読みづらくなってしまいます。

まず頭に浮かんだ方法として、

Container( color:Theme.of(context).brightness == Brightness.light ? Colors.blue[100] : Colors.blue, child:Text('test'), )

上記のようにすればダークテーマ時は背景色がColors.blueになるので、読みづらくなくなりました。

なのでここはこれで解決なのですが、こういうケースで上記のように手動で毎回ダークテーマ時の背景色を場合分けで指定するのは冗長に感じてしまいます。

フレームワークとしてもう少しスマートなやり方があるのかなあ、あれば良いなあ、という感じなのですが何かありますでしょうか?
頭に浮かんでいるのはTheme、ThemeDataを使って、アプリ全体で統一的にこういう問題を解決する(もっとスマートな)方法があるのか、ということが気になっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

実際に利用しているわけではないのですが、こんな方法があるのではないかというアイデアですが。

  1. 拡張メソッド(Extension methods)を使用する
    Themeに対して該当する色を取得するメソッド(とその色を保存する領域など)を追加してそれを呼び出すようにする。これの場合メソッドを追加したテーマオブジェクトを用意しMaterialApp経由で設定しておく必要があるようですが。
    https://stackoverflow.com/questions/49172746/is-it-possible-extend-themedata-in-flutter
    上記の2番目の回答がそれにあたると思います。

  2. 専用のウィジェットクラスを作る
    Textをコンテナでくくり特定の背景色を指定したものにするカスタムウィジェットを用意する。
    StatelessWidgetの派生で作るのが良いのかな?

    dart

    1class CustomText extends StatelessWidget { 2 const CustomText(this.data, {Key? key}) : super(key: key); 3 4 final String data; 5 6 7 Widget build(BuildContext context) { 8 return Container( 9 color: Theme.of(context).brightness == Brightness.light 10 ? Colors.blue[100] 11 : Colors.blue, 12 child: Text(data), 13 ); 14 } 15}

    呼び出し側はCustomText("test")で呼び出す。

  3. うえの1,2を合体させ、カスタムウィジェット内から拡張したメソッドで色を取り出すようにする。

投稿2022/03/30 00:47

ta.fu

総合スコア1740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moriman

2022/03/30 01:02

多分これがベストプラクティスのような気がします。 もしかしたら他にも何かあるのかもしれませんけど笑 まさにこういう時にカスタムウィジェットを定義したら良いですね、という感じですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問