Centralisez couleurs et typographies dans ThemeData, générez une palette Material 3 avec ColorScheme.fromSeed et offrez un mode sombre sans effort.
Ouvrir cette leçon dans KodokonCesser de styler widget par widget est un cap professionnel : ThemeData centralise couleurs, typographies et formes pour toute l'application. Avec Material 3 (activé par défaut depuis Flutter 3.16), tout part du ColorScheme : ColorScheme.fromSeed dérive d'une seule couleur graine une palette complète, harmonieuse et accessible.
import 'package:flutter/material.dart';
void main() {
runApp(const ShopApp());
}
class ShopApp extends StatelessWidget {
const ShopApp({super.key});
@override
Widget build(BuildContext context) {
const seed = Colors.teal;
return MaterialApp(
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: seed,
),
),
darkTheme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: seed,
brightness: Brightness.dark,
),
),
themeMode: ThemeMode.system,
home: Scaffold(
appBar: AppBar(title: const Text('Boutique')),
body: const Center(child: Text('Bienvenue')),
),
);
}
}Dans vos widgets, ne réinventez rien : lisez le thème ambiant avec Theme.of(context). Le colorScheme expose des rôles sémantiques (primary, onPrimary, primaryContainer, surface...) et textTheme des styles nommés (titleMedium, bodyLarge...). Un widget écrit ainsi s'adapte automatiquement au thème clair comme au sombre.
import 'package:flutter/material.dart';
class PriceTag extends StatelessWidget {
const PriceTag({super.key, required this.price});
final double price;
@override
Widget build(BuildContext context) {
final colors = Theme.of(context).colorScheme;
final text = Theme.of(context).textTheme;
return Container(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 6,
),
decoration: BoxDecoration(
color: colors.primaryContainer,
borderRadius: BorderRadius.circular(8),
),
child: Text(
'$price €',
style: text.titleMedium?.copyWith(
color: colors.onPrimaryContainer,
),
),
);
}
}Pour aller plus loin, configurez les thèmes de composants : chaque famille de widgets (barres d'application, boutons, champs de saisie) accepte un thème dédié dans ThemeData. Vous définissez une fois le rembourrage de vos boutons ou le centrage des titres, et chaque instance en hérite sans le moindre style local.
import 'package:flutter/material.dart';
final ThemeData appTheme = ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.teal,
),
appBarTheme: const AppBarTheme(
centerTitle: true,
elevation: 0,
),
filledButtonTheme: FilledButtonThemeData(
style: FilledButton.styleFrom(
padding: const EdgeInsets.symmetric(
horizontal: 24,
vertical: 12,
),
),
),
);