Flutter中initState调用MediaQuery获取屏幕尺寸报错的解决方法
解决initState中调用MediaQuery获取屏幕宽高的错误
错误原因
initState执行时,Widget还没完成挂载流程,此时通过context无法获取MediaQuery这类依赖InheritedWidget的数据,所以会抛出依赖未初始化的错误。
可行解决办法
1. 用addPostFrameCallback在第一帧后执行
这个回调会等待第一帧构建完成后触发,此时context已经能正常获取MediaQuery数据:
double anyvariable = 30.0; @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { final windowWidth = MediaQuery.of(context).size.width; setState(() { anyvariable = windowWidth / 2; }); }); }
2. 直接在build方法中计算(推荐)
如果这个变量只是用来构建UI,完全没必要在initState里提前初始化,直接在build里获取即可——build会在屏幕尺寸变化(比如旋转)时自动重新执行,还能自动适配:
@override Widget build(BuildContext context) { final windowWidth = MediaQuery.of(context).size.width; final anyvariable = windowWidth / 2; return Scaffold( // 在这里用anyvariable构建你的UI组件 ); }
3. 不依赖context,直接获取全局窗口尺寸
如果不需要和当前Widget的上下文绑定(比如要获取整个屏幕的原始尺寸),可以通过WidgetsBinding直接拿窗口数据,这个在initState里就能用,还不用调用setState:
double anyvariable = 30.0; @override void initState() { super.initState(); final window = WidgetsBinding.instance.window; // 物理尺寸除以设备像素比,得到逻辑分辨率 final windowWidth = window.physicalSize.width / window.devicePixelRatio; anyvariable = windowWidth / 2; // initState执行后会自动触发第一次build,所以不用setState }
内容的提问来源于stack exchange,提问作者Uwe.Schneider
相关产品推荐
相关产品推荐

