Flutter非空实例字段初始化报错与LateInitializationError运行时错误问题
问题根源
这是Dart空安全机制的强制要求:非空类型的实例字段必须在使用前完成初始化,你之前的写法没有完全覆盖所有场景下的初始化时机,冷启动时访问字段前未完成赋值就会触发报错。
可用解决方案
方案1:使用可空类型声明(最稳妥,推荐)
将主类中的字段声明为可空类型,完全贴合业务逻辑(方向详情本身就属于需要等待计算/接口返回后才会有值的字段,空状态是合理的):
// 主类中声明,?代表该字段可以为null DirectionDetails? tripDirectionDetails;
使用时做空判断即可:
// 赋值逻辑正常执行 tripDirectionDetails = DirectionDetails(/* 传入业务参数 */); // 使用前先判断非空 if(tripDirectionDetails != null) { print(tripDirectionDetails!.distanceText); // 也可以直接用?.规避空安全检查,不需要手动加! print(tripDirectionDetails?.distanceText); }
方案2:使用默认实例初始化(不需要做空判断)
你可以给DirectionDetails类预置一个静态默认实例,声明字段时直接初始化为该默认值,后续业务数据返回后再覆盖即可:
class DirectionDetails{ int distanceValue; int durationValue; String distanceText; String durationText; String encodedPoints; // 业务构造方法 DirectionDetails(this.distanceValue, this.durationValue, this.distanceText, this.durationText, this.encodedPoints); // 静态默认实例 static final DirectionDetails defaultInstance = DirectionDetails(0, 0, "", "", ""); }
主类中声明时直接赋值:
DirectionDetails tripDirectionDetails = DirectionDetails.defaultInstance;
后续有业务数据时直接覆盖字段值即可,不会触发未初始化错误。
注意事项
- 不要随意使用
late修饰符,除非你可以100%保证字段第一次被访问之前一定会完成赋值,否则必然会出现运行时崩溃。 - 你第二次冷启动报错的原因大概率是
tripDirectionDetails的赋值逻辑在异步回调中,冷启动时回调还未执行完成,就提前访问了该字段。如果使用可空类型,配合加载状态判断,未获取到数据前不访问该字段即可解决。
内容的提问来源于stack exchange,提问作者Manodhya Opallage
相关产品推荐
相关产品推荐

