93 lines
2.3 KiB
Dart
93 lines
2.3 KiB
Dart
import 'package:flisp_app/utils/theme_utils.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
class AppProvider with ChangeNotifier {
|
|
static const String _themeKey = 'selected_theme';
|
|
static const String _darkModeKey = 'is_dark_mode';
|
|
|
|
int _currentTab = 0;
|
|
bool _isDarkMode = false;
|
|
ThemeColor _currentTheme = defaultThemes[0];
|
|
late SharedPreferences _prefs;
|
|
bool _isInitialized = false;
|
|
|
|
AppProvider() {
|
|
_initPreferences();
|
|
}
|
|
|
|
// 初始化 SharedPreferences
|
|
Future<void> _initPreferences() async {
|
|
_prefs = await SharedPreferences.getInstance();
|
|
_loadPreferences();
|
|
_isInitialized = true;
|
|
notifyListeners();
|
|
}
|
|
|
|
// 加载存储的设置
|
|
void _loadPreferences() {
|
|
_isDarkMode = _prefs.getBool(_darkModeKey) ?? false;
|
|
|
|
// 加载主题色
|
|
final themeName = _prefs.getString(_themeKey);
|
|
if (themeName != null) {
|
|
// 根据主题名称查找对应的主题
|
|
final savedTheme = defaultThemes.firstWhere(
|
|
(theme) => theme.name == themeName,
|
|
orElse: () => defaultThemes[0],
|
|
);
|
|
_currentTheme = savedTheme;
|
|
}
|
|
}
|
|
|
|
// 保存主题色
|
|
Future<void> _saveTheme() async {
|
|
await _prefs.setString(_themeKey, _currentTheme.name);
|
|
}
|
|
|
|
// 保存暗黑模式
|
|
Future<void> _saveDarkMode() async {
|
|
await _prefs.setBool(_darkModeKey, _isDarkMode);
|
|
}
|
|
|
|
int get currentTab => _currentTab;
|
|
|
|
bool get isDarkMode => _isDarkMode;
|
|
|
|
ThemeColor get currentTheme => _currentTheme;
|
|
|
|
List<ThemeColor> get availableThemes => defaultThemes;
|
|
|
|
bool get isInitialized => _isInitialized;
|
|
|
|
void changeTab(int index) {
|
|
_currentTab = index;
|
|
notifyListeners();
|
|
}
|
|
|
|
// 切换明暗模式
|
|
void toggleDarkMode(bool value) {
|
|
_isDarkMode = value;
|
|
_saveDarkMode();
|
|
notifyListeners();
|
|
}
|
|
|
|
// 更改主题色
|
|
void changeTheme(ThemeColor theme) {
|
|
_currentTheme = theme;
|
|
_saveTheme();
|
|
notifyListeners();
|
|
}
|
|
|
|
ThemeData get currentThemeData {
|
|
return ThemeData(
|
|
primarySwatch: _currentTheme.materialColor,
|
|
colorScheme: ColorScheme.fromSeed(
|
|
seedColor: _currentTheme.primaryColor,
|
|
brightness: _isDarkMode ? Brightness.dark : Brightness.light,
|
|
),
|
|
useMaterial3: true,
|
|
fontFamily: 'CustomFont',
|
|
);
|
|
}
|
|
} |