Thématisation
Meilleures pratiques de thématisation Material 3 pour les applications Flutter utilisant ThemeData comme source unique de vérité pour les couleurs, la typographie, les styles de composants et l'espacement.
Normes fondamentales
Appliquez ces normes à TOUS les travaux de thématisation :
- Utilisez
ThemeDatacomme source unique de vérité — ne mettez jamais en dur les couleurs ou styles de texte dans les widgets - Référencez les couleurs via
Theme.of(context).colorScheme— jamaisColors.blue,Colors.redou de valeursColoren dur - Référencez les styles de texte via
Theme.of(context).textTheme— jamaisTextStyle(...)en dur dans le code widget - Utilisez
ColorSchemepour toutes les définitions de couleur — le système de couleurs structuré de Material 3 - Centralisez les thèmes de composants dans
ThemeData— définissezFilledButtonThemeData,InputDecorationTheme, etc. dans le thème, pas par widget - Définissez un système d'espacement avec une unité de base — pas de valeurs en pixels arbitraires pour le padding, les marges ou les écarts
- Supportez les thèmes clair et sombre dès le départ — utilisez
ThemeDatapour que le changement de thème ne nécessite zéro logique conditionnelle dans les widgets - Évitez la logique conditionnelle pour la thématisation dans l'interface — ne vérifiez jamais la luminosité dans le code widget ; laissez
ThemeDatas'en charger - Préférez
EdgeInsets.onlyetEdgeInsets.symmetric— jamaisEdgeInsets.fromLTRB(les arguments positionnels sont source d'erreurs)
Système de couleurs
Classe personnalisée de couleurs
Centralisez toutes les définitions de couleur dans une classe dédiée :
abstract class AppColors {
static const primaryColor = Color(0xFF4F46E5);
static const secondaryColor = Color(0xFF9C27B0);
static const errorColor = Color(0xFFDC2626);
static const surfaceColor = Color(0xFFFAFAFA);
}
Configuration de ColorScheme
La classe ColorScheme inclut 45 couleurs basées sur les spécifications Material 3. Configurez-la au sein de ThemeData :
ThemeData(
colorScheme: ColorScheme(
brightness: Brightness.light,
primary: AppColors.primaryColor,
secondary: AppColors.secondaryColor,
error: AppColors.errorColor,
surface: AppColors.surfaceColor,
onPrimary: Colors.white,
onSecondary: Colors.white,
onError: Colors.white,
onSurface: Colors.black,
),
)
Pour un prototypage rapide, utilisez ColorScheme.fromSeed() :
ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: AppColors.primaryColor,
),
)
Variantes de thème clair et sombre
class AppTheme {
static ThemeData get light => ThemeData(
colorScheme: ColorScheme(
brightness: Brightness.light,
primary: AppColors.primaryColor,
surface: AppColors.surfaceColor,
// ... rôles de couleur restants
),
);
static ThemeData get dark => ThemeData(
colorScheme: ColorScheme(
brightness: Brightness.dark,
primary: AppColors.primaryColorDark,
surface: AppColors.surfaceColorDark,
// ... rôles de couleur restants
),
);
}
Accès aux couleurs
@override
Widget build(BuildContext context) {
final colorScheme = Theme.of(context).colorScheme;
return ColoredBox(
color: colorScheme.surface,
child: Text(
'Hello',
style: TextStyle(color: colorScheme.onSurface),
),
);
}
Typographie
Définissez une classe AppTextStyle avec un style de base et des variantes nommées (displayLarge, headlineMedium, bodyLarge, etc.), puis intégrez-les dans ThemeData.textTheme. Accédez aux styles via Theme.of(context).textTheme.
Consultez references/typography.md pour la configuration des ressources de polices, la classe AppTextStyle complète, l'intégration de TextTheme et les modèles d'accès aux widgets.
Thèmes de composants
Définissez les thèmes de composants de manière centralisée dans ThemeData (par ex., filledButtonTheme, inputDecorationTheme, appBarTheme) plutôt que de styliser les instances de widget individuelles. Une classe AppTheme complète rassemble ColorScheme, TextTheme et tous les thèmes de composants dans un seul ThemeData.
Consultez references/components.md pour les exemples de thème FilledButton, InputDecoration et AppBar, l'assemblage du thème complet et les modèles d'accès aux widgets.
Système d'espacement
Définissez une classe AppSpacing avec une unité de base (par ex., 16px) et des constantes nommées (xxs à xxlg). Utilisez EdgeInsets.only ou EdgeInsets.symmetric — jamais EdgeInsets.fromLTRB.
Consultez references/spacing.md pour la classe AppSpacing complète, les exemples d'utilisation et les préférences EdgeInsets.
Modèles courants
Créer un thème
- Définissez
AppColorsavec toutes les constantes de couleur - Définissez
AppTextStyleavec toutes les constantes de style de texte - Définissez
AppSpacingavec une échelle d'espacement basée sur une unité de base - Créez une classe
AppThemeavec des getterslightetdark - Configurez
ColorScheme,TextThemeet les thèmes de composants dans chaqueThemeData - Passez
AppTheme.lightetAppTheme.darkàMaterialApp
Ajouter un nouveau jeton de couleur
- Ajoutez la constante de couleur à
AppColors - Mappez-la au rôle
ColorSchemeapproprié (ou créez une extension de thème pour les jetons personnalisés) - Référencez-la via
Theme.of(context).colorScheme.<role>dans les widgets
Support du mode sombre
- Créez des instances
ColorSchemeséparées pour le clair et le sombre - Utilisez le même
TextThemeet les mêmes thèmes de composants (ils s'adaptent automatiquement viacolorScheme) - Passez les deux thèmes à
MaterialAppviathemeetdarkTheme - Ne vérifiez jamais
Brightnessdans le code widget — laissezThemeDatagérer le changement
Référence rapide
| Propriété ThemeData | Objectif |
|---|---|
colorScheme |
Système de couleurs Material 3 (45 rôles) |
textTheme |
Échelle typographique (display, headline, body…) |
filledButtonTheme |
Style par défaut de FilledButton |
inputDecorationTheme |
Défauts de décoration TextField/TextFormField |
appBarTheme |
Style par défaut d'AppBar |
cardTheme |
Style par défaut de Card |
dialogTheme |
Style par défaut de Dialog |
| Rôle de couleur Material 3 | Utilisation typique |
|---|---|
primary |
Éléments UI clés, FAB, états actifs |
onPrimary |
Texte/icônes sur couleur primaire |
secondary |
Éléments UI moins importants |
surface |
Arrière-plans de carte, feuille, dialogue |
onSurface |
Texte/icônes sur couleur surface |
error |
Indicateurs d'erreur, actions destructrices |
outline |
Bordures, séparateurs |