This repository has been archived by the owner on Jun 9, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 258
/
app_theme.dart
73 lines (60 loc) · 2.21 KB
/
app_theme.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import 'package:app/data/app_error.dart';
import 'package:app/data/model/theme_setting.dart';
import 'package:app/data/provier/theme_repository_provider.dart';
import 'package:app/data/repository/theme_repository.dart';
import 'package:app/ui/change_notifier_with_error_handle.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
final appThemeNotifierProvider =
ChangeNotifierProvider<AppTheme>((ref) => AppTheme(ref));
ThemeData get lightTheme {
return ThemeData.light().copyWith(
visualDensity: VisualDensity.adaptivePlatformDensity,
textTheme: GoogleFonts.notoSansTextTheme(ThemeData.light().textTheme),
);
}
ThemeData get darkTheme {
return ThemeData.dark().copyWith(
visualDensity: VisualDensity.adaptivePlatformDensity,
textTheme: GoogleFonts.notoSansTextTheme(ThemeData.dark().textTheme),
);
}
class AppTheme extends AppChangeNotifier {
AppTheme(ProviderReference ref)
: _ref = ref,
super(ref);
static const _DEFAULT_THEME_SETTING = ThemeSetting.LIGHT;
final ProviderReference _ref;
ThemeRepository _repository;
ThemeSetting _setting;
ThemeSetting get setting => _setting;
Future<ThemeData> get themeData async {
if (setting == null) {
_repository ??= await _ref.read(themeRepositoryProvider.future);
_setting = _repository.loadThemeSetting() ?? _DEFAULT_THEME_SETTING;
}
return setting == ThemeSetting.LIGHT ? lightTheme : darkTheme;
}
Future<void> _loadLightTheme() async {
_repository ??= await _ref.read(themeRepositoryProvider.future);
_setting = ThemeSetting.LIGHT;
await _repository
.saveThemeSetting(setting)
.catchError((dynamic error) => doOnError(AppError(error)));
notifyListeners();
}
Future<void> _loadDarkTheme() async {
_repository ??= await _ref.read(themeRepositoryProvider.future);
_setting = ThemeSetting.DARK;
await _repository
.saveThemeSetting(setting)
.catchError((dynamic error) => doOnError(AppError(error)));
notifyListeners();
}
Future<void> toggle() async {
setting == ThemeSetting.LIGHT
? await _loadDarkTheme()
: await _loadLightTheme();
}
}