SingleChildScrollView内嵌水平ListView.builder自适应子项高度问题求解
问题根因
横向ListView默认会尝试撑满父级在滚动垂直方向的所有可用空间,而你将其放在了垂直滚动的SingleChildScrollView内部的Column中,该Column的垂直方向高度约束是无限的:
- 套固定高度
Container会强制限制列表高度,无法适配不同比例的图片 - 套
Expanded会触发高度约束冲突报错,因为无限高度下无法分配flex比例
解决方案
因为你的附件最多只有3张,性能开销极低,直接将ListView.builder替换为横向滚动的SingleChildScrollView + Row即可,Row会自动适配子元素的最大高度,完美实现高度自适应效果。
修改后的代码段如下:
Visibility( child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: List.generate(_attachments?.length ?? 0, (index) { return Stack( children: [ Container( margin: EdgeInsets.fromLTRB(0, 0, 5, 0), child: ClipRRect( child: Image.file(File(_attachments[index]), cacheWidth: 200), borderRadius: BorderRadius.circular(8.0), ), ), IconButton( onPressed: () { File(_attachments[index]).delete(); setState(() => _attachments.remove(_attachments[index])); }, icon: Icon(FontAwesomeIcons.trash, color: Colors.white, size: 20), padding: EdgeInsets.only(top: 4, left: 4), constraints: BoxConstraints(), ), ], ); }), ), ), visible: _attachments.length > 0, ),
可选优化(适用于图片数量多的场景)
如果后续需要展示大量图片必须用ListView.builder,可以提前计算所有图片的高度取最大值,动态赋值给外层Container的高度:
- 定义状态变量
double? _listMaxHeight - 每次选完图片后,遍历所有图片文件读取尺寸,计算每张图固定宽度200对应的高度,取最大值赋值给
_listMaxHeight - 外层Container的高度设为
_listMaxHeight即可
内容的提问来源于stack exchange,提问作者user1209216
相关产品推荐
相关产品推荐

