Flutter运行报错RenderBox was not laid out: 'hasSize'如何解决?
错误原因
RenderBox was not laid out: ... hasSize 是Flutter布局中典型的滚动组件嵌套冲突报错:
你在外层AllProducts页面的body中使用了垂直滚动的ListView,内部嵌套的ProductList组件返回的GridView.count默认也具备垂直滚动属性,两个无固定高度的垂直滚动组件嵌套时,内层GridView无法从父级获取到确定的布局高度约束,就会触发hasSize断言失败。
解决方案
两种适配方案按需选择即可:
- 方案1:让内部
GridView跟随外层ListView滚动(最常用,适合整个页面统一滚动的场景)
给GridView.count添加两个属性:GridView.count( shrinkWrap: true, // 让GridView高度收缩到适配子元素总高度,不会无限扩张 physics: const NeverScrollableScrollPhysics(), // 禁用GridView自身滚动,滚动事件交给外层ListView处理 padding: EdgeInsets.only(left: 20, right: 20), crossAxisCount: 2, crossAxisSpacing: 18, mainAxisSpacing: 18, // 其余原有代码保持不变 ) - 方案2:给
ProductList设置固定高度(适合需要商品列表区域固定高度、独立滚动的场景)
给ProductList里包裹FutureBuilder的Container添加高度属性:return Container( height: 600, // 自定义固定高度,给内部GridView提供明确的高度约束 child: FutureBuilder<List<Model>>( // 其余原有代码保持不变 ) );
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

