Flutter中SharedPreferences存布尔值失效,主题重启后重置问题求助
问题排查与修复方案
你的代码里存在几个关键问题,导致主题重启后重置:
savebool函数硬编码把colorMode存成true,完全没用到传入的参数,等于白存loadbool函数读取到SharedPreferences的值后,没赋值给colorMode,直接返回初始值,等于没读- 点击事件里
colorMode = colorMode是无效操作,根本没更新变量 - 主页面初始化时,没调用加载函数恢复之前保存的主题状态
- 点击事件里的
themeManager.themeMode == ThemeMode.dark只是个无效比较,啥也没做
修正后的主题相关代码
// 初始值先设为null,后续从SharedPreferences加载 bool? colorMode; Future<bool> savebool(bool value) async { SharedPreferences prefs = await SharedPreferences.getInstance(); // 存传入的value,不是硬编码的true await prefs.setBool("colorMode", value); // 更新本地变量 colorMode = value; return value; } Future<bool> loadbool() async { SharedPreferences prefs = await SharedPreferences.getInstance(); // 读取保存的值,没有的话默认用true(浅色模式) bool savedMode = prefs.getBool("colorMode") ?? true; // 赋值给colorMode colorMode = savedMode; return savedMode; } // 点击事件修正 InkWell( child: Row(mainAxisSize: MainAxisSize.min, children: const [ SizedBox(width: 30.0, height: 60.0), Text('- Dark Mode', style: TextStyle()), ]), onTap: () async { // 取反当前模式,实现切换 bool newMode = !(colorMode ?? true); setState(() { // 切换主题 themeManager.toggleTheme(newMode); colorMode = newMode; }); // 保存新的主题状态 await savebool(newMode); }, ),
修正后的主文件代码
ThemeManager themeManager = ThemeManager(); @override void initState() { super.initState(); themeManager.addListener(themeListener); // 初始化时加载保存的主题状态 _loadSavedTheme(); } // 加载保存的主题并设置 Future<void> _loadSavedTheme() async { bool savedMode = await loadbool(); themeManager.toggleTheme(savedMode); } @override void dispose() { themeManager.removeListener(themeListener); super.dispose(); } void themeListener() { if (mounted) { setState(() {}); } } // 保持原来的MultiProvider部分,确保themeManager正确提供 MultiProvider( providers: [ Provider(create: (_) => User), ChangeNotifierProvider(create: (context) => themeManager) ], child: MaterialApp( title: 'My app', themeMode: themeManager.themeMode, theme: ThemeData.light(), darkTheme: ThemeData.dark(), home: const LoginScreen(), debugShowCheckedModeBanner: false, ), );
额外说明
假设你的ThemeManager的toggleTheme方法是根据传入的bool值切换主题(比如true对应浅色,false对应深色),如果逻辑相反,调整newMode的取反逻辑即可。
内容的提问来源于stack exchange,提问作者It'sPhil
相关产品推荐
相关产品推荐

