Commit 279c8ab

derdilla <derdilla06@gmail.com>
2023-05-03 14:54:50
FEAT: settings screen for dark mode
1 parent 3b63147
android/app/build.gradle
@@ -54,8 +54,8 @@ android {
         // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
         minSdkVersion 19
         targetSdkVersion flutter.targetSdkVersion
-        versionCode 4
-        versionName "0.3"
+        versionCode 5
+        versionName "0.3.1"
     }
 
     signingConfigs {
lib/model/settings.dart
@@ -18,6 +18,8 @@ class Settings extends ChangeNotifier {
   late int _graphStepSize;
   late DateTime _graphStart;
   late DateTime _graphEnd;
+  late bool _followSystemDarkMode;
+  late bool _darkMode;
 
   Settings._create();
   Future<void> _asyncInit() async {
@@ -57,11 +59,15 @@ class Settings extends ChangeNotifier {
     var pGraphStepSize = _getSetting('_graphStepSize');
     var pGraphStart = _getSetting('_graphStart');
     var pGraphEnd = _getSetting('_graphEnd');
+    var pFollowSystemDarkMode = _getSetting('_followSystemDarkMode');
+    var pDarkMode = _getSetting('_darkMode');
     // var ...
 
     _graphStepSize = (await pGraphStepSize as int?) ?? TimeStep.day;
     _graphStart = DateTime.fromMillisecondsSinceEpoch((await pGraphStart as int?) ?? -1);
     _graphEnd = DateTime.fromMillisecondsSinceEpoch((await pGraphEnd as int?) ?? -1);
+    _followSystemDarkMode = ((await pFollowSystemDarkMode as int?) ?? "1") == "1" ? true : false;
+    _darkMode = ((await pDarkMode as int?) ?? "1") == "1" ? true : false;
     // ...
   }
 
@@ -91,6 +97,22 @@ class Settings extends ChangeNotifier {
     _saveSetting('_graphEnd', newGraphEnd.millisecondsSinceEpoch);
     notifyListeners();
   }
+  bool get followSystemDarkMode {
+    return _followSystemDarkMode;
+  }
+  set followSystemDarkMode(bool newSetting) {
+    _followSystemDarkMode = newSetting;
+    _saveSetting('_followSystemDarkMode', newSetting ? 1 : 0);
+    notifyListeners();
+  }
+  bool get darkMode {
+    return _darkMode;
+  }
+  set darkMode(bool newSetting) {
+    _darkMode = newSetting;
+    _saveSetting('_darkMode', newSetting ? 1 : 0);
+    notifyListeners();
+  }
 
 }
 
lib/screens/home.dart
@@ -1,4 +1,5 @@
 import 'package:blood_pressure_app/screens/add_measurement.dart';
+import 'package:blood_pressure_app/screens/settings.dart';
 import 'package:flutter/material.dart';
 import 'package:blood_pressure_app/components/measurement_graph.dart';
 import 'package:blood_pressure_app/components/measurement_list.dart';
@@ -33,10 +34,26 @@ class AppHome extends StatelessWidget {
         ),
       ),
       floatingActionButton:
-        Container(
-          height: 110,
+        SizedBox(
+          height: 150,
           child: Column(
             children: [
+              Ink(
+                decoration: ShapeDecoration(
+                    shape: const CircleBorder(),
+                    color: Theme.of(context).unselectedWidgetColor
+                ),
+                child: IconButton(
+                  icon: const Icon(Icons.settings),
+                  onPressed: () {
+                    Navigator.push(
+                      context,
+                      MaterialPageRoute(builder: (context) => const SettingsScreen()),
+                    );
+                  },
+                ),
+              ),
+              const SizedBox(height: 10,),
               Ink(
                 decoration: ShapeDecoration(
                     shape: const CircleBorder(),
lib/screens/settings.dart
@@ -1,1 +1,52 @@
-// TODO
\ No newline at end of file
+import 'package:blood_pressure_app/model/settings.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:settings_ui/settings_ui.dart';
+
+class SettingsScreen extends StatelessWidget {
+  const SettingsScreen({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: const Text('Settings'),
+        backgroundColor: Theme.of(context).primaryColor,
+      ),
+      body: Consumer<Settings>(
+          builder: (context, settings, child) {
+            return SettingsList(sections: [
+              SettingsSection(
+                  title: const Text('common'),
+                  tiles: <SettingsTile>[
+                    SettingsTile.switchTile(
+                        initialValue: settings.followSystemDarkMode,
+                        onToggle: (value) {
+                          settings.followSystemDarkMode = value;
+                        },
+                        leading: const Icon(Icons.auto_mode),
+                        title: const Text('follow system dark mode')
+                    ),
+                    SettingsTile.switchTile(
+                        initialValue: (() {
+                          if (settings.followSystemDarkMode) {
+                            return MediaQuery.of(context).platformBrightness == Brightness.dark;
+                          }
+                          return settings.darkMode;
+                        })(),
+                        onToggle: (value) {
+                          settings.darkMode = value;
+                        },
+                      leading: const Icon(Icons.dark_mode),
+                        title: const Text('enable dark mode'),
+                      enabled: !settings.followSystemDarkMode,
+                    ),
+                  ]
+              )
+            ]);
+          }
+      ),
+    );
+  }
+
+}
\ No newline at end of file
lib/main.dart
@@ -37,20 +37,32 @@ class AppRoot extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return MaterialApp(
-      title: 'Blood Pressure Logger',
-      theme: ThemeData(
-          primaryColor: Colors.teal
-      ),
-      darkTheme: ThemeData(
-          brightness: Brightness.dark,
-          canvasColor: Colors.black,
-          primaryColor: Colors.teal.shade400,
-          iconTheme: const IconThemeData(color: Colors.black)
-      ),
-      themeMode: ThemeMode.system,
-      home: const AppHome(),
-    );
+    return Consumer<Settings>(
+        builder: (context, settings, child) {
+          late var mode;
+          if (settings.followSystemDarkMode) {
+            mode = ThemeMode.system;
+          } else if (settings.darkMode) {
+            mode = ThemeMode.dark;
+          } else {
+            mode = ThemeMode.light;
+          }
+
+          return MaterialApp(
+            title: 'Blood Pressure App',
+            theme: ThemeData(
+                primaryColor: Colors.teal
+            ),
+            darkTheme: ThemeData(
+                brightness: Brightness.dark,
+                canvasColor: Colors.black,
+                primaryColor: Colors.teal.shade400,
+                iconTheme: const IconThemeData(color: Colors.black)
+            ),
+            themeMode:  mode,
+            home: const AppHome(),
+          );
+        });
   }
 }
 
pubspec.lock
@@ -304,6 +304,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "6.0.5"
+  settings_ui:
+    dependency: "direct main"
+    description:
+      name: settings_ui
+      sha256: d9838037cb554b24b4218b2d07666fbada3478882edefae375ee892b6c820ef3
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.2"
   share_plus:
     dependency: "direct main"
     description:
pubspec.yaml
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
 # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
 # In Windows, build-name is used as the major, minor, and patch parts
 # of the product and file versions while build-number is used as the build suffix.
-version: 0.3.0
+version: 0.3.1
 
 environment:
   sdk: '>=2.19.6 <3.0.0'
@@ -42,6 +42,7 @@ dependencies:
   fl_chart: ^0.62.0
   file_saver: ^0.2.1
   share_plus: ^4.5.3
+  settings_ui: ^2.0.2
 
 dev_dependencies:
   flutter_test: