Flutter开发出现non-nullable变量未初始化错误如何解决?
报错原因
这是Dart 2.12及以上版本空安全机制的强制校验规则:非可空类型的变量必须在声明时完成初始化,或通过语法明确告知编译器该变量会在使用前完成赋值。
你代码中的静态变量都属于非可空类型,仅声明未赋值,虽然init方法中会完成赋值,但编译器无法保证你在访问这些变量前一定会先调用init,因此抛出编译错误。
最优解决方案
给所有静态变量添加late修饰符,明确告知编译器这些变量会在使用前完成初始化,修改后代码如下:
static late MediaQueryData _mediaQueryData; static late double screenWidth; static late double screenHeight; static late double defaultSize; // 原代码存在拼写错误deafualtSize,建议修正为defaultSize static late Orientation orientation; void init(BuildContext context) { _mediaQueryData = MediaQuery.of(context); screenWidth = _mediaQueryData.size.width; screenHeight = _mediaQueryData.size.height; orientation = _mediaQueryData.orientation; } }
注意:使用
late修饰后必须保证在访问上述变量前先调用init方法,否则运行时会抛出LateInitializationError初始化异常。
可选兼容方案
如果无法保证init一定会在变量访问前调用,可以将变量声明为可空类型:
static MediaQueryData? _mediaQueryData; static double? screenWidth; static double? screenHeight; static double? defaultSize; static Orientation? orientation;
后续使用这些变量时,要么先做非空判断,要么添加!强制断言非空,示例如下:
// 非空判断用法 if(screenWidth != null) { double width = screenWidth! * 0.8; }
内容的提问来源于stack exchange,提问作者Ahmed Al-Khateeb
相关产品推荐
相关产品推荐

