You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:36:02