Flutter非空变量未初始化错误求助:size_config.dart文件报错
解决SizeConfig类中非空变量未初始化的错误
错误原因
这是Flutter空安全机制导致的问题:从Flutter 2.0开始,所有非空类型的变量必须在声明时完成初始化,或者明确标记为可空类型。你代码里的静态变量(_mediaQueryData、screenWidth等)都是非空类型,但声明时没有赋值,因此触发编译错误。另外注意defaultSize变量在init方法里也没有被赋值,后续使用也会出问题。
解决办法
有两种可行的修复方案:
方案1:使用late关键字
late关键字用于告诉Dart编译器,这个非空变量会在首次使用之前被初始化(比如你会先调用init方法再访问这些变量),适合确定初始化时机的场景。
修改后的代码:
import 'package:flutter/material.dart'; class SizeConfig { static late MediaQueryData _mediaQueryData; static late double screenWidth; static late double screenHeight; static late double defaultSize; static late Orientation orientation; static void init(BuildContext context) { _mediaQueryData = MediaQuery.of(context); screenHeight = _mediaQueryData.size.height; screenWidth = _mediaQueryData.size.width; orientation = _mediaQueryData.orientation; // 补充defaultSize的赋值,示例按宽高比例计算 defaultSize = orientation == Orientation.landscape ? screenHeight * 0.024 : screenWidth * 0.024; } } double getProportionateScreenHeight(double inputHeight) { double screenHeight = SizeConfig.screenHeight; return (inputHeight / 812.0) * screenHeight; } double getProportionateScreenWidth(double inputWidth) { double screenWidth = SizeConfig.screenWidth; return (inputWidth / 375.0) * screenWidth; }
注意:确保在访问SizeConfig的静态变量前,已经调用过SizeConfig.init(context),比如在MaterialApp的首页initState里调用,否则会触发运行时错误。
方案2:将变量标记为可空类型
给变量类型后加上?,表示变量可以为null,访问时需要处理null情况(比如用!断言或者空判断):
修改后的代码:
import 'package:flutter/material.dart'; class SizeConfig { static MediaQueryData? _mediaQueryData; static double? screenWidth; static double? screenHeight; static double? defaultSize; static Orientation? orientation; static void init(BuildContext context) { _mediaQueryData = MediaQuery.of(context); screenHeight = _mediaQueryData!.size.height; screenWidth = _mediaQueryData!.size.width; orientation = _mediaQueryData!.orientation; defaultSize = orientation == Orientation.landscape ? screenHeight! * 0.024 : screenWidth! * 0.024; } } double getProportionateScreenHeight(double inputHeight) { double screenHeight = SizeConfig.screenHeight!; return (inputHeight / 812.0) * screenHeight; } double getProportionateScreenWidth(double inputWidth) { double screenWidth = SizeConfig.screenWidth!; return (inputWidth / 375.0) * screenWidth; }
这种方案需要在访问变量时用!断言(确保变量已经被初始化),如果变量未初始化就访问会触发运行时错误。
额外提示
- 建议把
init方法改为静态方法,否则需要实例化SizeConfig才能调用,不符合工具类的设计。 - 必须补充
defaultSize的赋值逻辑,否则即使修复了初始化错误,后续使用defaultSize也会出现问题。
内容的提问来源于stack exchange,提问作者Rakshit
相关产品推荐
相关产品推荐

