Skip to content

Commit c3e26a8

Browse files
fix: theme was not persistant
Now using shared prefs for persistant storage and riverpod to maintain the state of the theme
1 parent 2338ac1 commit c3e26a8

File tree

2 files changed

+49
-21
lines changed

2 files changed

+49
-21
lines changed

lib/main.dart

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,46 +3,63 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
33
import 'package:shared_preferences/shared_preferences.dart';
44
import 'package:sysadmin/core/theme/app_theme.dart';
55
import 'package:sysadmin/presentation/screens/dashboard/index.dart';
6-
import 'package:sysadmin/providers/theme_provider.dart';
76
import 'package:sysadmin/presentation/screens/onboarding/index.dart';
7+
import 'package:sysadmin/providers/theme_provider.dart';
88

99
void main() async {
1010
WidgetsFlutterBinding.ensureInitialized();
1111
final prefs = await SharedPreferences.getInstance();
1212
final bool isOnBoardingDone = prefs.getBool('isOnBoardingDone') ?? false;
1313
runApp(
1414
ProviderScope(
15-
child: SysAdminMaterialApp(isOnBoardingDone: isOnBoardingDone)
15+
child: SysAdminMaterialApp(
16+
isOnBoardingDone: isOnBoardingDone,
17+
)
1618
)
1719
);
1820
}
1921

2022
// Returns Material App
2123
class SysAdminMaterialApp extends ConsumerWidget {
22-
final bool isOnBoardingDone;
24+
final bool isOnBoardingDone;
2325

24-
const SysAdminMaterialApp({
26+
const SysAdminMaterialApp({
2527
super.key,
2628
this.isOnBoardingDone = false,
2729
});
2830

2931
@override
3032
Widget build(BuildContext context, WidgetRef ref) {
31-
final isDark = ref.watch(themeProvider);
32-
33-
return MaterialApp(
34-
debugShowCheckedModeBanner: false,
35-
theme: AppTheme.lightTheme,
36-
darkTheme: AppTheme.darkTheme,
37-
themeMode: isDark ? ThemeMode.dark : ThemeMode.light,
38-
title: 'SysAdmin',
39-
home: SysAdminApp(isOnBoardingDone: isOnBoardingDone),
33+
final isDarkTheme = ref.watch(themeProvider);
34+
final initialThemeAsync = ref.watch(initialThemeProvider);
35+
36+
return initialThemeAsync.when(
37+
data: (_) => MaterialApp(
38+
debugShowCheckedModeBanner: false,
39+
theme: AppTheme.lightTheme,
40+
darkTheme: AppTheme.darkTheme,
41+
themeMode: isDarkTheme ? ThemeMode.dark : ThemeMode.light,
42+
title: 'SysAdmin',
43+
home: SysAdminApp(isOnBoardingDone: isOnBoardingDone),
44+
),
45+
loading: () => const MaterialApp(
46+
home: Scaffold(
47+
body: Center(
48+
child: CircularProgressIndicator(),
49+
),
50+
),
51+
),
52+
error: (error, stack) => MaterialApp(
53+
home: Scaffold(
54+
body: Center(
55+
child: Text('Error loading theme: $error'),
56+
),
57+
),
58+
),
4059
);
4160
}
42-
4361
}
4462

45-
// Returns Scaffold
4663
class SysAdminApp extends StatelessWidget {
4764
final bool isOnBoardingDone;
4865

@@ -53,11 +70,10 @@ class SysAdminApp extends StatelessWidget {
5370

5471
@override
5572
Widget build(BuildContext context) {
56-
57-
return Scaffold(
73+
return Scaffold(
5874
body: Center(
5975
child: isOnBoardingDone ? const DashboardScreen() : const OnBoarding(),
6076
),
6177
);
6278
}
63-
}
79+
}

lib/providers/theme_provider.dart

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
import 'package:flutter_riverpod/flutter_riverpod.dart';
2+
import 'package:shared_preferences/shared_preferences.dart';
23

4+
// Provider to get the initial theme value
5+
final initialThemeProvider = FutureProvider<bool>((ref) async {
6+
final prefs = await SharedPreferences.getInstance();
7+
return prefs.getBool('isDark') ?? false;
8+
});
9+
10+
// Theme state provider
311
final themeProvider = StateNotifierProvider<ThemeNotifier, bool>((ref) {
4-
return ThemeNotifier();
12+
// Get the initial value synchronously, fall back to false if not loaded yet
13+
final initialTheme = ref.watch(initialThemeProvider).value ?? false;
14+
return ThemeNotifier(initialTheme);
515
});
616

717
class ThemeNotifier extends StateNotifier<bool> {
8-
ThemeNotifier() : super(false); // Start with light theme
18+
ThemeNotifier(super.initialState);
919

10-
void toggleTheme() {
20+
void toggleTheme() async {
21+
final prefs = await SharedPreferences.getInstance();
22+
await prefs.setBool('isDark', !state);
1123
state = !state;
1224
}
1325
}

0 commit comments

Comments
 (0)