Dart空安全下设备尺寸适配类静态变量初始化报错如何解决?
错误原因
Dart空安全机制要求所有非空类型的变量必须在使用前完成赋值,你代码中SizeConfig类的静态属性仅在init方法调用时才会被赋值,编译器无法识别你是否会在使用这些属性前调用init,因此抛出必须初始化的错误。
最优解决方案
使用late关键字修饰这些静态变量,作用是告知编译器你会负责在使用这些变量前完成赋值,无需在声明时就给初始值,修改后的SizeConfig类代码如下:
import 'package:flutter/material.dart'; class SizeConfig { // 添加late关键字修饰 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); screenWidth = mediaQueryData.size.width; screenHeight = mediaQueryData.size.height; orientation = mediaQueryData.orientation; // 补充defaultSize的赋值,可根据你的业务需求调整计算逻辑 defaultSize = orientation == Orientation.vertical ? screenWidth * 0.024 : screenHeight * 0.024; } } double getProportionateScreenHeight(double inputHeight) { double screenHeight = SizeConfig.screenHeight; return (inputHeight / 896.0) * screenHeight; } double getProportionateScreenWidth(double inputWidth) { double screenWidth = SizeConfig.screenWidth; return (inputWidth / 414.0) * screenWidth; }
对应的init调用方式也可以简化为:
class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { // 直接调用静态方法,无需实例化 SizeConfig.init(context); return Scaffold(); } }
注意事项
- 必须保证
SizeConfig.init在所有调用getProportionateScreenHeight、getProportionateScreenWidth方法的代码之前执行,建议放在应用根路由的build方法中初始化,避免出现运行时的LateInitializationError。 - 如果你需要兼容忘记调用
init的场景,可以将变量改为可空类型(比如static MediaQueryData? mediaQueryData),在使用时判空并给默认 fallback 值,不过该方案会增加冗余的判空逻辑,适配场景下不推荐使用。
内容的提问来源于stack exchange,提问作者Anant Verma
相关产品推荐
相关产品推荐

