如何使用Shared_Preferences保存animated_theme_switcher切换的主题,重启后生效
实现步骤
1. 引入本地存储依赖
首先在pubspec.yaml中添加本地存储库依赖:
dependencies: flutter: sdk: flutter shared_preferences: ^2.2.2 # 可替换为当前最新版本 animated_theme_switcher: # 保留你已安装的现有依赖
执行flutter pub get完成依赖安装。
2. 修改App初始化逻辑,读取已保存的主题
App启动时优先读取本地存储的主题配置,无存储记录时才 fallback 到系统默认主题,修改main.dart入口逻辑:
void main() async { // 初始化组件绑定,保证runApp前的异步操作正常执行 WidgetsFlutterBinding.ensureInitialized(); // 读取本地存储的主题配置 final prefs = await SharedPreferences.getInstance(); final savedIsDark = prefs.getBool('isDarkMode'); late ThemeData initialTheme; if (savedIsDark != null) { // 存在存储的主题配置,直接使用 initialTheme = savedIsDark ? darkTheme : lightTheme; } else { // 无存储记录,使用系统默认主题 final isPlatformDark = WidgetsBinding.instance.window.platformBrightness == Brightness.dark; initialTheme = isPlatformDark ? darkTheme : lightTheme; } runApp(MyApp(initialTheme: initialTheme)); } // 修改MyApp类接收初始主题参数 class MyApp extends StatelessWidget { final ThemeData initialTheme; const MyApp({super.key, required this.initialTheme}); @override Widget build(BuildContext context) { return ThemeProvider( // 直接使用读取到的初始主题,无需再在此处判断系统亮度 initTheme: initialTheme, builder: (context, theme) { return MaterialApp( theme: theme, home: MyApp1(), debugShowCheckedModeBanner: false, ); }, ); } }
3. 修改主题切换逻辑,持久化用户选择
在主题切换按钮的点击事件中,新增存储用户所选主题的逻辑:
onPressed: () async { var brightness = ThemeProvider.of(context)!.brightness; final newIsDark = brightness == Brightness.light; // 新增:将用户选择的主题存入本地 final prefs = await SharedPreferences.getInstance(); await prefs.setBool('isDarkMode', newIsDark); ThemeSwitcher.of(context)!.changeTheme( theme: newIsDark ? darkTheme : lightTheme, reverseAnimation: brightness == Brightness.dark, ); setState(() { toggle = !toggle; }); },
以上修改完成后,用户选择的主题会持久化保存在本地,应用重启后会优先读取存储的配置加载对应主题。
内容的提问来源于stack exchange,提问作者Anatoly Kuznetsov
相关产品推荐
相关产品推荐

