Проблема
Способ расширения ThemeData
во Flutter - это часто задаваемый вопрос в StackOverflow: Можно ли« расширить ThemeData во Flutter».
Есть даже проблемы, созданные в официальном репозитории Flutter:
- Добавить настраиваемые свойства в ThemeData
- Запрос функции: расширение ThemeData с помощью палитр для конкретных приложений
В dart 2.7 это, наконец, возможно с помощью методов расширения.
Примечание
- Можно расширить
ThemeData
объект, но большинству из нас нужна только собственная цветовая палитра. Для простоты я бы вместо этого расширил объектColorScheme
в следующем примере. - Команда 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: () {}, )
Посетите этот репозиторий, чтобы увидеть полный пример.
Недостатки
- Методы расширения не позволяют нам объявлять свойства экземпляра. Поэтому невозможно использовать другую цветовую схему для другого
ThemeData
(например, светлая или темная тема). [См. Решение в разделе Обновления ниже.] - Вы не можете создавать варианты
ColorScheme
(например, другойsuccess
цвет в некоторых компонентах) с помощью функции.copyWith()
. Так что это очень похоже на этот метод до версии 2.7, только немного более элегантно.
Обновления
Как предполагает Пабло Паскуалино, мы действительно можем работать со светлой / темной яркостью следующим образом:
Спасибо, Пабло!
Вы знаете, что за статью можно хлопать до 50 раз? Давай, попробуй!