From 8cd1635decc27eb6bf226084d1dac3f12b28d3de Mon Sep 17 00:00:00 2001 From: Eric Windmill Date: Wed, 6 Aug 2025 12:11:30 -0400 Subject: [PATCH] add dark mode --- cupertino_gallery/lib/gallery_home.dart | 14 +++++++-- cupertino_gallery/lib/main.dart | 27 ++++++++++++++-- cupertino_gallery/lib/settings_page.dart | 39 ++++++++++++++++++------ 3 files changed, 66 insertions(+), 14 deletions(-) diff --git a/cupertino_gallery/lib/gallery_home.dart b/cupertino_gallery/lib/gallery_home.dart index 5558ffe9f..c86fd73a2 100644 --- a/cupertino_gallery/lib/gallery_home.dart +++ b/cupertino_gallery/lib/gallery_home.dart @@ -3,7 +3,14 @@ import 'settings_page.dart'; import 'widgets_page.dart'; class GalleryHome extends StatelessWidget { - const GalleryHome({super.key}); + const GalleryHome({ + super.key, + required this.onThemeChange, + required this.isDarkMode, + }); + + final ValueChanged onThemeChange; + final bool isDarkMode; @override Widget build(BuildContext context) { @@ -25,7 +32,10 @@ class GalleryHome extends StatelessWidget { builder: (BuildContext context) { return switch (index) { 0 => const WidgetsPage(), - 1 => const SettingsPage(), + 1 => SettingsPage( + onThemeChange: onThemeChange, + isDarkMode: isDarkMode, + ), _ => const Center(child: Text('Widgets')), }; }, diff --git a/cupertino_gallery/lib/main.dart b/cupertino_gallery/lib/main.dart index 2c1d98a22..167075488 100644 --- a/cupertino_gallery/lib/main.dart +++ b/cupertino_gallery/lib/main.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'gallery_home.dart'; @@ -10,11 +11,33 @@ void main() { runApp(const CupertinoGalleryApp()); } -class CupertinoGalleryApp extends StatelessWidget { +class CupertinoGalleryApp extends StatefulWidget { const CupertinoGalleryApp({super.key}); + @override + State createState() => _CupertinoGalleryAppState(); +} + +class _CupertinoGalleryAppState extends State { + ThemeMode _themeMode = ThemeMode.system; + + void _handleThemeChange(bool isDarkMode) { + setState(() { + _themeMode = isDarkMode ? ThemeMode.dark : ThemeMode.light; + }); + } + @override Widget build(BuildContext context) { - return const CupertinoApp(title: 'Cupertino Gallery', home: GalleryHome()); + return CupertinoApp( + title: 'Cupertino Gallery', + theme: CupertinoThemeData( + brightness: _themeMode == ThemeMode.dark ? Brightness.dark : Brightness.light, + ), + home: GalleryHome( + onThemeChange: _handleThemeChange, + isDarkMode: _themeMode == ThemeMode.dark, + ), + ); } } diff --git a/cupertino_gallery/lib/settings_page.dart b/cupertino_gallery/lib/settings_page.dart index 37f1a05f3..8fb85db1d 100644 --- a/cupertino_gallery/lib/settings_page.dart +++ b/cupertino_gallery/lib/settings_page.dart @@ -1,22 +1,39 @@ import 'package:flutter/cupertino.dart'; class SettingsPage extends StatefulWidget { - const SettingsPage({super.key}); + const SettingsPage({ + super.key, + required this.onThemeChange, + required this.isDarkMode, + }); + + final ValueChanged onThemeChange; + final bool isDarkMode; @override State createState() => _SettingsPageState(); } class _SettingsPageState extends State { - bool _darkMode = false; double _textSize = 1.0; + late bool isDarkMode; + + @override + void initState() { + isDarkMode = widget.isDarkMode; + super.initState(); + } + + @override + void didChangeDependencies() { + isDarkMode = widget.isDarkMode; + super.didChangeDependencies(); + } @override Widget build(BuildContext context) { return CupertinoPageScaffold( - navigationBar: const CupertinoNavigationBar( - middle: Text('Settings'), - ), + navigationBar: const CupertinoNavigationBar(middle: Text('Settings')), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -26,10 +43,11 @@ class _SettingsPageState extends State { CupertinoListTile( title: const Text('Dark Mode'), trailing: CupertinoSwitch( - value: _darkMode, - onChanged: (bool value) { + value: isDarkMode, + onChanged: (bool isActive) { setState(() { - _darkMode = value; + isDarkMode = isActive; + widget.onThemeChange(isActive); }); }, ), @@ -75,7 +93,8 @@ class _SettingsPageState extends State { builder: (BuildContext context) => CupertinoAlertDialog( title: const Text('Reset Settings'), content: const Text( - 'Are you sure you want to reset all settings?'), + 'Are you sure you want to reset all settings?', + ), actions: [ CupertinoDialogAction( child: const Text('Cancel'), @@ -88,7 +107,7 @@ class _SettingsPageState extends State { child: const Text('Reset'), onPressed: () { setState(() { - _darkMode = false; + widget.onThemeChange(false); _textSize = 1.0; }); Navigator.pop(context);