Flutter明暗模式切换遇空检查错误,需Shared Preferences持久化状态
问题分析与修复方案
错误根源
- 空值强制解包触发异常:首次启动应用时,SharedPreferences中不存在
isDark键,CacheHelper.getBoolian返回null,此时使用!强制解包直接触发Null check operator used on a null value错误。 - 键名不匹配+拼写错误:Cubit中保存模式的键是
' isaDarMode'(带空格+拼写错误),但读取时用的是'isDark',导致重启后无法读取之前保存的状态。 - 初始值未兜底:未给模式状态设置默认值,首次启动无缓存数据时直接返回null。
分步修复
1. 修复main函数的空值问题与初始值设置
修改读取逻辑,给isDark设置默认值false,避免空值:
void main() async { WidgetsFlutterBinding.ensureInitialized(); DioHelper.init(); await CacheHelper.init(); // 首次无缓存时默认使用明亮模式(false),避免null bool isDark = CacheHelper.getBoolian(key: 'isDark') ?? false; runApp(MyApp(isDark)); }
2. 修复Cubit的键名与拼写错误
统一键名为'isDark',修正变量和状态类的拼写错误:
bool isDarkMode = true; // 修正变量名拼写 void changeAppMode({bool? fromShared}) { if (fromShared != null) { isDarkMode = fromShared; emit(AppChangeModeState()); // 修正状态类名拼写 } else { isDarkMode = !isDarkMode; } // 键名改为与读取一致的'isDark',去掉多余空格 CacheHelper.putBoolian(key: 'isDark', value: isDarkMode) .then((value) { emit(AppChangeModeState()); // 修正状态类名拼写 print('状态保存并分发成功'); }); }
3. 增强CacheHelper的健壮性(可选)
添加sharedPreferences的空值判断,避免未初始化时调用方法:
import 'package:shared_preferences/shared_preferences.dart'; class CacheHelper { static SharedPreferences? sharedPreferences; static Future<void> init() async { sharedPreferences = await SharedPreferences.getInstance(); } static Future<bool> putBoolian({ required String key, required bool value, }) async { if (sharedPreferences == null) await init(); return await sharedPreferences!.setBool(key, value); } static bool? getBoolian({ required String key, }) { if (sharedPreferences == null) return null; return sharedPreferences!.getBool(key); } }
验证效果
- 首次启动应用时,默认启用明亮模式(
false) - 切换明暗模式后,状态会持久化保存到SharedPreferences
- 重启应用后,自动加载上次保存的模式状态
内容的提问来源于stack exchange,提问作者Zeyad Mohamed
相关产品推荐
相关产品推荐

