如何在可滚动SliverList的Stack组件中正常放置Container?
问题原因
- Stack默认会将自身尺寸调整为非定位/非对齐子组件的最大尺寸,你当前代码的Stack中未做对齐/定位约束的第一个Container高度为
createSize(347, context),所以Stack整体高度被限制为347,底部对齐的307高度的Container会有部分高度超出Stack可视范围,才会出现无法正常展示的问题。 - 你要实现的上层图片、下层圆角卡片叠在图片底部的布局,需要明确Stack的高度为两个组件叠加后的总高度,或者给Stack的子组件用Positioned明确位置约束。
修复后的代码示例
SliverList( delegate: SliverChildListDelegate([ // 明确Stack总高度:图片高度 + 卡片超出图片的高度,数值可根据实际设计调整 SizedBox( height: createSize(534, context), child: Stack( children: [ // 顶部背景图固定在上部 Positioned( top: 0, left: 0, right: 0, child: Container( decoration: const BoxDecoration( image: DecorationImage( fit: BoxFit.cover, image: NetworkImage( 'https://idsb.tmgrup.com.tr/ly/uploads/images/2020/05/13/35552.jpeg'), ), ), height: createSize(347, context), ), ), // 底部卡片从图片下方指定位置开始,占满剩下的高度 Positioned( top: createSize(227, context), // 数值控制卡片和背景图的重叠高度,可自行调整 left: 0, right: 0, bottom: 0, child: Container( decoration: const BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( topLeft: Radius.circular(24), topRight: Radius.circular(24), ), ), // 卡片内部内容可以直接加在这里,也可以包裹SingleChildScrollView做独立滚动 ), ), ], ), ), // 这里可以继续加其他内容组件,会跟着SliverList整体滚动 ]), )
补充说明
如果需要卡片内部内容独立于整体Sliver滚动,只需要给底部Container包裹SingleChildScrollView组件即可。
内容的提问来源于stack exchange,提问作者Abin Sunny
相关产品推荐
相关产品推荐

