SliverGrid清空全部子组件时报scrollExtent为负异常如何解决?
问题根因
该错误是SliverGrid默认布局计算逻辑的已知问题:当子组件列表为空时,布局计算过程中仍会尝试叠加主轴间距值,最终得到负数的滚动范围触发校验异常,和能否完成绘制无关。
推荐解决方案
方案1:动态渲染SliverGrid(优先推荐)
在子组件列表为空时直接不渲染SliverGrid,替换为无尺寸的Sliver占位组件,完全规避布局异常,也不会产生多余间距:
// 替换你原本直接写SliverGrid.count的代码 sessionState.patientQuestionnaires.isNotEmpty ? SliverGrid.count( // 这里直接粘贴你原来的SliverGrid.count全部配置和children逻辑即可,不需要改动 mainAxisSpacing: 10.0, crossAxisSpacing: 10.0, crossAxisCount: segmentedControlGroupValue, children: <Widget>[ for (var i = 0; i < sessionState.patientQuestionnaires.length; i++) // 你原来的子组件代码 ], ) : const SliverToBoxAdapter(child: SizedBox.shrink());
如果需要展示空状态提示,只需要把SizedBox.shrink()换成你自定义的空状态提示组件即可。
方案2:改用SliverGrid.builder构造
对于动态增减子项的列表场景,使用builder构造的SliverGrid天然兼容itemCount为0的情况,不需要额外判断:
SliverGrid.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: segmentedControlGroupValue, mainAxisSpacing: 10.0, crossAxisSpacing: 10.0, ), itemCount: sessionState.patientQuestionnaires.length, itemBuilder: (context, i) { // 直接粘贴你原来的子组件(Material部分)的全部代码即可 return Material( color: Colors.white, borderRadius: BorderRadius.circular(6), elevation: 6, shadowColor: Colors.black38, // 剩余子组件逻辑不变 ); }, )
该方案的优势是列表项复用性更高,长列表性能优于SliverGrid.count构造,也完全不会出现空列表异常。
内容的提问来源于stack exchange,提问作者JonasLevin
相关产品推荐
相关产品推荐

