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: (_) {}, ); } }
排查分析
SwitchSettingsTile的onChange回调为空,切换开关时没有将新的状态值持久化到Settings中,导致ValueChangeObserver无法感知状态变化,退出Drawer后UI没有重建为对应模式。- 若
SharePreferenceCache的实现存在缺陷,没有在值变更时触发通知,也会导致ValueChangeObserver无法及时更新UI。
修复指导
- 完善状态更新逻辑:修改
DarkModeWidget的onChange回调,确保状态变更时同步到Settings:onChange: (value) { Settings.setBool(keyDarkMode, value); }, - 检查缓存通知机制:确认
SharePreferenceCache在执行setBool后,正确触发了ValueChangeObserver的监听回调,保证状态变更能通知到上层UI。 - 确保上下文同步:避免Drawer被缓存或使用旧的上下文,确保Drawer是
Scaffold的直接子组件,能获取到MaterialApp重建后的最新Theme。
内容的提问来源于stack exchange,提问作者SUD
相关产品推荐
相关产品推荐

