11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Flutter] 統一感のある色使いを実現しよう!

Last updated at Posted at 2024-10-14

導入

こんにちは、もんすんです。
Flutterで個人開発していると、諸々Widgetに色をつける際、ついつい、一つ一つのWidgetにcolorをしてしまいがちですよね。

それでは、統一感のある色が実現できず、配色もまだらなアプリが出来上がってしまいます。

そこで、今回は、ColorSchemeを利用してアプリの配色に統一感を持たせました!

ColorSchemeとは

FlutterのColorSchemeは、アプリ全体のカラーパレットを一元管理するための仕組みです。Material Designのガイドラインに沿った色を提供し、テーマ全体の一貫性を保ちやすくします。

ColorSchemeの基本的な構造

ColorSchemeには、以下のような設定項目があり、それぞれに色を設定することができます。

Primary Colors(主要カラー)

  • primary: アプリやブランドのメインカラーとして利用する
  • onPrimary: primary上に表示されるテキストやアイコンの色
  • primaryContainer: primaryの変化版、コンテナや背景に使用
  • onPrimaryContainer: primaryContainer上のテキスト・アイコンの色

Secondary Colors(補助カラー)

  • secondary: 補助的に使われる色
  • onSecondary: secondary上のテキスト・アイコンの色

Error Colors(エラーカラー)

  • error: エラー表示に使われる色
  • onError: エラー背景上のテキスト・アイコンの色

Surface(サーフェス)

  • surface: カードやシートのようなサーフェス用
  • onSurface: サーフェス上のテキスト・アイコンの色

ColorSchemeの実装

fromSeedを用いた例

import 'package:flutter/material.dart';

ColorScheme defaultLightColorScheme = ColorScheme.fromSeed(
    seedColor: Colors.blue, // ベースとなる色
    brightness: Brightness.light, // ライトテーマ
);

ColorScheme.fromSeedを利用すると、seedColorで指定した色から自動で色の組み合わせを生成してくれます。この際に生成される色の組み合わせは、Material 3というものに準拠したものになっており、アクセシビリティを考慮したカレーパレットが適用されます。

また、brightnessで、ダークテーマかライトテーマかを設定することができます。
これを設定することで、端末の明るさ設定がライトからダークに切り替わったりした際に適用する

ColorSchemeを一から作成する例

import 'package:flutter/material.dart';

ColorScheme defaultColors = ColorScheme.light(
    primary: Colors.blue,
    onPrimary: Colors.green,
    primaryContainer: Colors.blueAccent,
    onPrimaryContainer: Colors.greenAccent,
    secondary: Colors.yellow,
    onSecondary: Colors.black38,
    surface: Colors.white12,
    onSurface: Colors.pink,
    error: Colors.redAccent,
);

こちらは、ColorSchemelightメソッド、もしくはdarkメソッド内で、使用する色を設定していくものになります。
fromSeedと異なり、自分でそれぞれの色を設定することが可能です。
fromSeedの欠点としては、自動的にからパレットが決まってしまうことが挙げられますが、こちらでは自分で自由に設定できるというメリットがあります。
一方で、適当に設定してしまうと、アクセシビリティが損なわれます。この上記に示したColorSchemeは適当に作成したので、下の方で、如何に酷いかを示します。

ColorSchemeの呼び出し

@override
Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
            // ここに設定します。
            colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
            useMaterial3: true,
        ),
        home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
}

上記の場合、seedColordeepPurpleにしたアプリケーションとなります。

seedColorblueに変更すると以下のような色合いになります。

いい感じの配色に簡単に変更できます。
これならデザイン素人のエンジニアでも配色を気にせず、実装できますね。

また、ダークカラー設定や前述したような別ファイルで定義したColorSchemeを利用する場合は、以下のようにMaterialApp内の実装を変更します。

return MaterialApp(
    title: 'Flutter Demo',
    theme: ThemeData(
        colorScheme: defaultColors,
        useMaterial3: true,
    ),
    // darkThemeを追加します。
    darkTheme: ThemeData(
        // ここにダークテーマを設定します。
        colorScheme: ColorScheme.dark(
            primary: Colors.blue,
            ... ,
        ),
        useMaterial3: true,
    ),
    home: const MyHomePage(title: 'Flutter Demo Home Page'),
);

以下では、ColorSchemeに上記で実装した[defaultColors]を適用させたものを示します。

正しく適用されました。
しかし、適当ではやはり色合いは良くなさそうですね。
fromSeedを利用しない場合は、デザイナーのアドバイスがあったほうが良さそうです。

ColorSchemeで指定した色の利用

基本的にTheme.of(context).colorSchemeを指定し、さらにそこから利用するカラーにあたる設定項目を指定します。

Text(
    '表示テキスト',
    style: TextStyle(
    color: Theme.of(context).colorScheme.onPrimary,
    ),
),

これで、このTextの文字色はColorSchemeで設定したonPrimaryの色が適用されます。

終わりに

ColorSchemeを使うことで、Flutterアプリの配色に統一感を持たせることができました。fromSeedで簡単に色を生成する方法と、手動で色を設定する方法の両方を紹介しましたが、目的に応じて使い分けるのがポイントです。デザインの知識がなくてもColorSchemeを活用すれば、見た目の良いアプリを作ることができるので、ぜひ活用してみてください!

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?