Flutter触发'has size'断言错误,SingleChildScrollView嵌套布局异常如何解决
触发错误的原代码
SingleChildScrollView( child: Column( children: [ SizedBox( width: MediaQuery.of(context).size.width, child: Row( children: [ Container( width: double.infinity, child: Text('yes'), ) ], ), ) ], ), );
错误触发原因
- Flutter布局遵循「父组件传递约束、子组件确定自身尺寸、子组件尺寸必须符合父组件约束」的规则,当组件无法计算得到确定的尺寸时就会抛出
has size类断言错误。 - 本次报错的核心逻辑是:
Row组件在主轴(默认水平方向)会给子组件传递无上限的宽度约束,此时给Row的直接子Container设置width: double.infinity,相当于要求组件在无限宽的父级约束中占满全部宽度,Flutter无法计算出这个「无限宽度」对应的确定数值,因此触发报错。 - 外层添加
SizedBox限制Row宽度依然报错的原因是:SizedBox仅约束了Row本身的宽度,但Row内部对其子组件的主轴约束规则不变,依然是水平方向无上限,子组件的double.infinity还是找不到确定的尺寸边界,因此报错依然存在。
修复方案
以下三种方案任选其一即可:
- 方案1:用
Expanded包裹Container,Expanded会自动占满Row剩余的所有可用宽度,无需手动设置double.infinity
修改后代码示例:
SingleChildScrollView( child: Column( children: [ SizedBox( width: MediaQuery.of(context).size.width, child: Row( children: [ Expanded( child: Container( child: Text('yes'), ), ) ], ), ) ], ), );
- 方案2:如果不需要占满
Row的剩余宽度,直接给Container设置明确的固定宽度数值,替换掉double.infinity即可。 - 方案3:如果需要子组件自适应宽度、不强制占满剩余空间,可以用
Flexible包裹Container,同时避免宽度溢出。
报错截图

内容的提问来源于stack exchange,提问作者dipansh
相关产品推荐
相关产品推荐

