Проблема

Способ расширения ThemeData во Flutter - это часто задаваемый вопрос в StackOverflow: Можно ли« расширить ThemeData во Flutter».

Есть даже проблемы, созданные в официальном репозитории Flutter:

  1. Добавить настраиваемые свойства в ThemeData
  2. Запрос функции: расширение ThemeData с помощью палитр для конкретных приложений

В dart 2.7 это, наконец, возможно с помощью методов расширения.

Примечание

  1. Можно расширить ThemeData объект, но большинству из нас нужна только собственная цветовая палитра. Для простоты я бы вместо этого расширил объект ColorScheme в следующем примере.
  2. Команда Flutter перемещает цветовые зависимости компонентов материала с ThemeData на ColorScheme, давайте поработаем с этим перспективным решением.

Решение

Давайте создадим цветовую схему со вкусом бутстрапа:

Прежде всего, создайте файл custom_color_scheme.dart:

import 'package:flutter/material.dart';
extension CustomColorScheme on ColorScheme {
  Color get success => const Color(0xFF28a745);
  Color get info => const Color(0xFF17a2b8);
  Color get warning => const Color(0xFFffc107);
  Color get danger => const Color(0xFFdc3545);
}

Затем импортируйте этот файл в свои компоненты, и вы сразу же сможете использовать этот цвет.

import 'custom_color_scheme.dart';
FlatButton(
  color: Theme.of(context).colorScheme.success,
  textColor: Colors.white,
  child: const Text('Success'),
  onPressed: () {},
)

Посетите этот репозиторий, чтобы увидеть полный пример.

Недостатки

  1. Методы расширения не позволяют нам объявлять свойства экземпляра. Поэтому невозможно использовать другую цветовую схему для другого ThemeData (например, светлая или темная тема). [См. Решение в разделе Обновления ниже.]
  2. Вы не можете создавать варианты ColorScheme (например, другой success цвет в некоторых компонентах) с помощью функции .copyWith(). Так что это очень похоже на этот метод до версии 2.7, только немного более элегантно.

Обновления

Как предполагает Пабло Паскуалино, мы действительно можем работать со светлой / темной яркостью следующим образом:

Спасибо, Пабло!

Вы знаете, что за статью можно хлопать до 50 раз? Давай, попробуй!