Flutter如何为同一ListTile设置双背景色 实现trailing区域满宽显示
问题原因
Flutter 原生ListTile的trailing区域存在内置布局约束与默认边距,直接给trailing内的组件设置背景色,仅会包裹trailing自身内容,无法突破布局限制延伸到屏幕最右边缘,因此原有写法无法实现需求。
实现代码
放弃使用ListTile自带的trailing参数,通过Row手动拆分布局结构,让右侧区域自动撑满剩余横向空间即可实现效果,可直接运行的示例代码如下:
Container( width: double.infinity, child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ // 左侧头像区域,和原生ListTile内边距对齐 const Padding( padding: EdgeInsets.symmetric(horizontal: 16, vertical: 12), child: CircleAvatar( backgroundImage: AssetImage("assets/images/image.jpeg"), ), ), // 中间标题、副标题区域,内容自适应宽度 Padding( padding: const EdgeInsets.symmetric(vertical: 12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ const Text("Annie Jospeh"), const SizedBox(height: 4), Row( mainAxisSize: MainAxisSize.min, children: const [ Icon( Icons.person_add, size: 20, color: Color.fromRGBO(8, 183, 119, 1), ), SizedBox(width: 5), Text("10"), SizedBox(width: 30), Text( "\$", style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, color: Color.fromRGBO(8, 183, 119, 1), ), ), SizedBox(width: 5), Text("10"), ], ), ], ), ), // 右侧trailing区域,撑满剩余所有横向空间 Expanded( child: Container( color: const Color.fromRGBO(234, 244, 225, 1), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 24), alignment: Alignment.centerLeft, child: const Text("Hello"), ), ) ], ), )
效果说明
- 左侧头像、标题、副标题的视觉对齐效果和原生ListTile完全一致
- 右侧区域背景色会自动填充横向剩余空间,一直延伸到屏幕最右边缘,不存在多余边距
- 可通过调整Container的
alignment、padding参数自由控制右侧文本的位置,适配不同设计要求 - 如果需要添加点击水波纹效果,只需要给最外层Container套一层
InkWell即可,用法和原生ListTile的onTap一致
内容的提问来源于stack exchange,提问作者Aanand S
相关产品推荐
相关产品推荐

