Flutter中遗留null check错误是否会影响后续部署及线上实际使用?
现有处理方式的风险
放任未捕获的空值/下标越界异常风险极高:
- 线上环境出现这类未处理异常会直接导致应用闪退,严重影响用户体验
- 不同系统、设备版本对异常的容忍度不同,测试阶段未复现的问题线上大概率会出现
- 异常会中断后续业务逻辑执行,依赖该存储值的功能会全部失效,甚至引发连锁崩溃
- 应用上架审核时会被检测为稳定性问题,大概率会被驳回
修复方案
方案1:读取时直接配置符合业务要求的默认值
你当前代码的默认值是空数组,直接修改默认值为符合你业务长度要求的布尔列表即可,比如你需要访问下标1,说明至少需要2个元素,默认值按你实际需要的总长度配置即可:
Future<void> loadFavorite() async{ SharedPreferences prefs = await SharedPreferences.getInstance(); setState((){ // 此处List.filled的第一个参数填你实际需要的收藏选项总数量,默认值可按需求改成true/false FavoriteButtons = (prefs.getStringList("favorite4") ?? List<String>.generate(2, (index) => 'false')) .map((value) => value == 'true').toList(); }); }
方案2:应用启动阶段预初始化存储值(更稳妥)
在应用启动时就检查对应的存储key是否存在,不存在直接写入默认值,后续所有读取逻辑都不需要再处理空的情况:
void main() async { // 初始化原生通道 WidgetsFlutterBinding.ensureInitialized(); SharedPreferences prefs = await SharedPreferences.getInstance(); // 检查收藏配置是否存在,不存在写入默认值 if (!prefs.containsKey("favorite4")) { // 第一个参数填实际收藏选项总数量 List<String> defaultFavorites = List<String>.generate(2, (index) => 'false'); await prefs.setStringList("favorite4", defaultFavorites); } runApp(const MyApp()); }
方案3:取值时增加安全校验(兜底防护)
不管前面的初始化逻辑怎么写,取值的时候都增加下标合法性判断,避免后续业务调整数组长度后再次出现同类问题:
// 不要直接写 FavoriteButtons[1] bool secondItemValue = FavoriteButtons.length > 1 ? FavoriteButtons[1] : false; // Flutter 3.10+ 可以直接用扩展方法更简洁 bool secondItemValue = FavoriteButtons.elementAtOrNull(1) ?? false;
内容的提问来源于stack exchange,提问作者j l
相关产品推荐
相关产品推荐

