Flutter报错Non-nullable实例字段categoryTitle未初始化如何解决?
问题根因
- Dart空安全规则要求非空类型的实例字段必须在使用前完成初始化,你声明的
String categoryTitle属于非空类型,既没有初始化默认值,也没有在构造方法中赋值,因此触发Non-nullable instance field must be initialized编译报错。 - 加
late修饰后仍然报错的核心问题:你在didChangeDependencies方法内声明了同名局部变量final categoryTitle,赋值操作仅作用于这个局部变量,类的成员变量categoryTitle全程没有被赋值,运行时调用就会触发late字段未初始化异常。
修复方案
第一步:调整字段声明
给categoryTitle加上late修饰,你是在早于build执行的didChangeDependencies生命周期中赋值,完全符合late的使用规范。
late String categoryTitle; late List<Meal> displayedMeals; bool _loadedInitData = false;
第二步:修正赋值逻辑
删除didChangeDependencies中categoryTitle前的final关键字,改为给类成员变量赋值:
@override void didChangeDependencies() { if (!_loadedInitData) { final routeArgs = ModalRoute.of(context)!.settings.arguments as Map<String, String>; // 去掉前面的final,直接给类的成员变量赋值 categoryTitle = routeArgs['title'] as String; final categoryId = routeArgs['id']; displayedMeals = DUMMY_MEALS.where((meal) { return meal.categories.contains(categoryId); }).toList(); _loadedInitData = true; } super.didChangeDependencies(); }
额外说明(删除功能不生效排查)
你写的_removeMeal删除逻辑本身没有问题,如果操作后列表没有更新,只需要检查MealItem组件内部,触发删除操作的回调是否正确调用了传入的removeItem方法即可。
内容的提问来源于stack exchange,提问作者kavya bhargava
相关产品推荐
相关产品推荐

