Colores de Theme.of(context)
Parte de la sección Diseños que se adaptan del Journey de Flutter de Coddy. Lección 22 de 30.
Los botones adoptan el tema por sí solos. Tus propios contenedores no: un Container con Colors.teal.shade100 conserva ese color independientemente del tema.
Para colorear tus propios widgets según el tema, léelo con Theme.of(context):
final colors = Theme.of(context).colorScheme;
Container(
color: colors.primaryContainer,
child: Text('Hi', style: TextStyle(color: colors.onPrimaryContainer)),
)El esquema de colores viene en pares. primaryContainer es un relleno suave, y onPrimaryContainer es el color del texto sobre ese relleno, elegido para que sea fácil de leer. Lo mismo ocurre con primary y onPrimary, surface y onSurface.
Theme.of(context) encuentra el tema que está por encima del widget que lo solicita. El tema lo establece MaterialApp, así que el context debe estar debajo de este, como en el build de HomeScreen. En el propio build de MyApp, que está por encima de MaterialApp, solo encuentra el púrpura predeterminado de Flutter.
Desafío
FácilColorea el banner usando el tema, para que siga cualquier semilla que elijas:
- al principio de
builddeHomeScreen:final colors = Theme.of(context).colorScheme; - el color del banner:
colors.primaryContainer - el color de su texto:
colors.onPrimaryContainer
Pruébalo tú mismo
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),
),
),
],
),
),
);
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Diseños que se adaptan
1Compartir una fila
Expanded ocupa toda la filaCompartir espacio con flexFlexible se ajusta a su hijoSpacer separa los elementos4Tamaños y puntos de ruptura
Ancho completo: double.infinityUn ancho máximoTamaño de pantalla: MediaQueryPuntos de ruptura con LayoutBuilder2El error de desbordamiento
El error de desbordamientoSolución al desbordamiento: expandirSolución al desbordamiento: desplazamientoSolución al desbordamiento: ajustarEspaciado dentro de un ajuste5Enumeraciones y switch
Enumeraciones para tipos de pantallaUsar switch con una enumeraciónExpresiones switch3Apilar widgets
Apilar widgets uno encima de otroPosicionado en una esquinaAlinear dentro de una cajaSafeArea y la muesca6Temas y modo oscuro
Un tema para la app a partir de una semillaColores de Theme.of(context)Estilos de texto del temaUn tema oscuroUn interruptor para el modo oscuroPractica por tu cuenta: Compilador de Flutter online