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

Flutter明暗模式切换遇空检查错误,需Shared Preferences持久化状态

问题分析与修复方案

错误根源

  1. 空值强制解包触发异常:首次启动应用时,SharedPreferences中不存在isDark键,CacheHelper.getBoolian返回null,此时使用!强制解包直接触发Null check operator used on a null value错误。
  2. 键名不匹配+拼写错误:Cubit中保存模式的键是' isaDarMode'(带空格+拼写错误),但读取时用的是'isDark',导致重启后无法读取之前保存的状态。
  3. 初始值未兜底:未给模式状态设置默认值,首次启动无缓存数据时直接返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:19:01