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

Flutter暗黑模式初始正常,退出Drawer后失效问题求助

Flutter暗黑模式切换异常问题
  • 问题现象:首次点击进入Drawer时暗黑模式可正常工作,但退出Drawer后模式失效(截图显示切换暗黑模式后,退出Drawer界面恢复为浅色模式)

相关代码

main.dart

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Settings.init(cacheProvider: SharePreferenceCache());

  return runApp(
    ValueChangeObserver<bool>(
      cacheKey: DarkModeWidget.keyDarkMode,
      defaultValue: false,
      builder: (_, isDarkMode, __) => MaterialApp(
        title: 'Smash Up Companion',
        theme: isDarkMode
            ? ThemeData.dark().copyWith(
                primaryColor: AppColors.mainGreenColor,
                scaffoldBackgroundColor: const Color(0xFF170635),
                canvasColor: const Color(0xFF170635),
                dividerColor: Colors.white,
              )
            : ThemeData.light().copyWith(
                primaryColor: AppColors.mainBlueColor,
                scaffoldBackgroundColor: Colors.white,
                canvasColor: Colors.white,
                dividerColor: AppColors.mainBlueColor),
        // ... 省略其他代码
      ),
    ),
  );
}

DarkModeWidget类

class DarkModeWidget extends StatelessWidget {
  static const keyDarkMode = 'key-dark-mode';
  const DarkModeWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SwitchSettingsTile(
      settingKey: keyDarkMode,
      leading: const IconWidget(
        icon: Icons.dark_mode,
        color: Color(0xFF642ef3),
      ),
      title: 'Dark Mode',
      onChange: (_) {},
    );
  }
}

排查分析

  1. SwitchSettingsTile的onChange回调为空,切换开关时没有将新的状态值持久化到Settings中,导致ValueChangeObserver无法感知状态变化,退出Drawer后UI没有重建为对应模式。
  2. 若SharePreferenceCache的实现存在缺陷,没有在值变更时触发通知,也会导致ValueChangeObserver无法及时更新UI。

修复指导

  • 完善状态更新逻辑:修改DarkModeWidget的onChange回调,确保状态变更时同步到Settings:
    onChange: (value) {
      Settings.setBool(keyDarkMode, value);
    },
    
  • 检查缓存通知机制:确认SharePreferenceCache在执行setBool后,正确触发了ValueChangeObserver的监听回调,保证状态变更能通知到上层UI。
  • 确保上下文同步:避免Drawer被缓存或使用旧的上下文,确保Drawer是Scaffold的直接子组件,能获取到MaterialApp重建后的最新Theme。

内容的提问来源于stack exchange,提问作者SUD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:18:50