Un interrupteur pour le mode sombre
Fait partie de la section Des mises en page adaptées du Journey Flutter de Coddy. Leçon 25 sur 30.
Certaines personnes veulent le mode sombre dans une application, mais pas dans les autres. Proposez-leur un interrupteur.
themeMode: est un paramètre comme un autre, il peut donc provenir de l’état. Gardez un bool dans l’State de MyApp, le widget qui construit MaterialApp, et choisissez le mode à partir de celui-ci :
bool _dark = false;
MaterialApp(
themeMode: _dark ? ThemeMode.dark : ThemeMode.light,
...
)Lorsque l’interrupteur modifie _dark dans setState, build s’exécute à nouveau, MaterialApp applique le nouveau mode et tous les écrans changent de thème en même temps, avec un bref fondu.
L’état doit se trouver au-dessus de MaterialApp, car c’est là que le thème est choisi. C’est pourquoi MyApp est ici un StatefulWidget.
Défi
FacileFais basculer le thème avec l’interrupteur :
- dans
onChanged, stocke la nouvelle valeur dans_darkà l’intérieur desetState - définis le
themeMode:deMaterialAppà partir de_dark: sombre lorsqu’il vaut true, clair lorsqu’il vaut false
Essayez vous-même
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool _dark = false;
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo),
),
darkTheme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.indigo,
brightness: Brightness.dark,
),
),
home: Scaffold(
appBar: AppBar(title: const Text('Night Reader')),
body: Center(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Text('Dark mode', style: TextStyle(fontSize: 20)),
const SizedBox(width: 12),
Switch(
value: _dark,
onChanged: (value) {},
),
],
),
),
),
);
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Des mises en page adaptées
1Partager une ligne
Expanded remplit la lignePartager l’espace avec flexFlexible épouse son enfantSpacer écarte les éléments4Tailles et points de rupture
Pleine largeur : double.infinityUne largeur maximaleTaille de l’écran : MediaQueryPoints de rupture de LayoutBuilder2L’erreur de débordement
L’erreur de débordementCorrection du débordement : agrandirCorrection du débordement : faire défilerCorrection du débordement : renvoyer à la ligneEspacement à l’intérieur d’un renvoi à la ligne5Énumérations et switch
Énumérations pour les types d’écranUtiliser switch avec une énumérationExpressions switch3Empiler des widgets
Empiler des widgets les uns sur les autresPositionner dans un coinAligner à l’intérieur d’une boîteSafeArea et l’encoche6Thèmes et mode sombre
Un thème d’application généré à partir d’une couleur de baseLes couleurs de Theme.of(context)Styles de texte du thèmeUn thème sombreUn interrupteur pour le mode sombreEntraînez-vous par vous-même : Compilateur Flutter en ligne