diff --git a/lib/main.dart b/lib/main.dart index c6a69655..9c7c3dad 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'dart:io'; import 'dart:math' as math; +import 'package:apidash/providers/providers.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:window_size/window_size.dart' as window_size; @@ -39,11 +40,12 @@ void main() async { ); } -class App extends StatelessWidget { +class App extends ConsumerWidget { const App({Key? key}) : super(key: key); @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { + final theme = ref.watch(themeStateProvider); return MaterialApp( debugShowCheckedModeBanner: false, theme: ThemeData( @@ -52,6 +54,17 @@ class App extends StatelessWidget { useMaterial3: true, brightness: Brightness.light, ), + darkTheme: ThemeData( + fontFamily: GoogleFonts.openSans().fontFamily, + colorSchemeSeed: Colors.blue, + useMaterial3: true, + brightness: Brightness.dark, + ), + themeMode: theme != null + ? theme + ? ThemeMode.light + : ThemeMode.dark + : ThemeMode.system, home: const HomePage(), ); } diff --git a/lib/providers/providers.dart b/lib/providers/providers.dart index ab17e9a2..1f8bca6b 100644 --- a/lib/providers/providers.dart +++ b/lib/providers/providers.dart @@ -12,6 +12,26 @@ final codePaneVisibleStateProvider = StateProvider((ref) => false); final saveDataStateProvider = StateProvider((ref) => false); final clearDataStateProvider = StateProvider((ref) => false); +final StateNotifierProvider themeStateProvider = + StateNotifierProvider((ref) => ThemeStateNotifier()); + +class ThemeStateNotifier extends StateNotifier { + ThemeStateNotifier() : super(false) { + loadData(); + } + + final hiveHandler = HiveHandler(); + + Future toggle() async { + state = !state!; + await hiveHandler.setTheme(state); + } + + void loadData() { + state = hiveHandler.getTheme() ?? false; + } +} + final StateNotifierProvider?> collectionStateNotifierProvider = StateNotifierProvider((ref) => CollectionStateNotifier()); diff --git a/lib/screens/home_page/editor_pane/editor_pane.dart b/lib/screens/home_page/editor_pane/editor_pane.dart index f8bb299e..d1a407b2 100644 --- a/lib/screens/home_page/editor_pane/editor_pane.dart +++ b/lib/screens/home_page/editor_pane/editor_pane.dart @@ -48,6 +48,7 @@ class RequestEditorPaneHome extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final theme = ref.watch(themeStateProvider); return Padding( padding: const EdgeInsets.symmetric( vertical: 40, @@ -155,6 +156,48 @@ class RequestEditorPaneHome extends ConsumerWidget { ), ], ), + kVSpacer10, + Row( + children: [ + Text.rich( + TextSpan( + children: [ + const TextSpan( + text: "Choose your theme now: ", + ), + WidgetSpan( + alignment: PlaceholderAlignment.middle, + child: ElevatedButton( + onPressed: () async => await ref + .read(themeStateProvider.notifier) + .toggle(), + child: Row( + children: [ + theme != null + ? theme + ? const Icon(Icons.dark_mode) + : const Icon(Icons.light_mode) + : const Icon(Icons.light_mode), + kHSpacer10, + Text.rich( + TextSpan( + text: theme != null + ? theme + ? "Dark" + : "Light" + : "Light", + ), + ), + ], + ), + ), + ), + ], + ), + style: Theme.of(context).textTheme.titleMedium, + ), + ], + ), kVSpacer20, kVSpacer10, Row( diff --git a/lib/services/hive_services.dart b/lib/services/hive_services.dart index 975af5c3..415a4b55 100644 --- a/lib/services/hive_services.dart +++ b/lib/services/hive_services.dart @@ -6,6 +6,9 @@ const String kDataBox = "data"; // sequence of ids const String kDataBoxIds = "ids"; +// dark theme boolean +const String kDataBoxTheme = "theme"; + Future openBoxes() async { await Hive.initFlutter(); await Hive.openBox(kDataBox); @@ -18,6 +21,9 @@ class HiveHandler { dataBox = Hive.box(kDataBox); } + dynamic getTheme() => dataBox.get(kDataBoxTheme); + Future setTheme(bool? theme) => dataBox.put(kDataBoxTheme, theme); + dynamic getIds() => dataBox.get(kDataBoxIds); Future setIds(List? ids) => dataBox.put(kDataBoxIds, ids);