Цвета Theme.of(context)
Часть раздела Адаптивная компоновка путешествия по Flutter на Coddy. Урок 22 из 30.
Кнопки сами подхватывают тему. Ваши собственные контейнеры — нет: Container с Colors.teal.shade100 сохраняет этот цвет независимо от темы.
Чтобы окрашивать собственные виджеты цветами из темы, получите её с помощью Theme.of(context):
final colors = Theme.of(context).colorScheme;
Container(
color: colors.primaryContainer,
child: Text('Hi', style: TextStyle(color: colors.onPrimaryContainer)),
)Цветовая схема состоит из пар. primaryContainer — это мягкий цвет заливки, а onPrimaryContainer — цвет текста на этой заливке, выбранный так, чтобы текст было легко читать. То же относится к primary и onPrimary, surface и onSurface.
Theme.of(context) находит тему выше виджета, который её запрашивает. Тему задаёт MaterialApp, поэтому context должен принадлежать виджету внутри него, например методу build у HomeScreen. В собственном методе build класса MyApp, который находится выше MaterialApp, будет найдена только фиолетовая тема Flutter по умолчанию.
Задание
ЛегкоРаскрась баннер цветом из темы, чтобы он соответствовал любому выбранному тобой начальному цвету:
- в начале метода
buildклассаHomeScreen:final colors = Theme.of(context).colorScheme; - цвет баннера:
colors.primaryContainer - цвет текста:
colors.onPrimaryContainer
Попробуйте сами
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.teal),
),
home: const HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Bookshelf')),
body: Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
Container(
width: double.infinity,
padding: const EdgeInsets.all(24),
decoration: BoxDecoration(
color: Colors.teal.shade100,
borderRadius: BorderRadius.circular(16),
),
child: Text(
'You read 12 books this year',
style: TextStyle(fontSize: 20, color: Colors.teal.shade900),
),
),
],
),
),
);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Адаптивная компоновка
1Совместное размещение в строке
Expanded заполняет строкуДелим пространство с flexFlexible подстраивается под размер дочернего элементаSpacer раздвигает элементы2Ошибка переполнения
Ошибка переполненияИсправление переполнения: расширениеИсправление переполнения: прокруткаИсправление переполнения: переносИнтервалы внутри переноса5Перечисления и switch
Перечисления для типов экрановКонструкция switch с перечислениемВыражения switch3Компоновка виджетов в стопку
Расположить виджеты друг над другомРазмещение в углуВыравнивание внутри блокаSafeArea и вырез экрана6Темы и тёмный режим
Тема приложения на основе seedЦвета Theme.of(context)Стили текста из темыТёмная темаПереключатель тёмного режимаПотренируйтесь самостоятельно: Онлайн-компилятор Flutter