Flutter如何移除Stack中Positioned包裹的IconButton默认边距
解决方案
问题根源
IconButton是符合Material设计规范的组件,默认自带两个会产生额外边距的配置:
- 默认内置最小尺寸约束为
48x48,仅设置padding为0无法取消该最小尺寸预留的空白区域 - 默认点击目标适配属性
materialTapTargetSize为MaterialTapTargetSize.padded,会额外扩展边距适配无障碍点击需求
修复方案
方案1:调整IconButton自带属性
给IconButton新增两个属性即可移除默认边距:
IconButton( padding: EdgeInsets.zero, // 原有配置保留 constraints: BoxConstraints(), // 移除默认最小尺寸约束 materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, // 取消点击区域的额外扩展 icon: Icon( Icons.delete_forever, color: Colors.greenAccent, size: 32, ), onPressed: () {}, )
方案2:替换为GestureDetector+Icon(无默认约束)
如果不需要IconButton自带的水波纹、高亮等Material交互效果,直接用手势识别组件包裹Icon,完全自定义边距更灵活:
Positioned( left: 0, bottom: 0, child: GestureDetector( onTap: () {}, child: Icon( Icons.delete_forever, color: Colors.greenAccent, size: 32, ), ), )
完整修正代码
@override Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, backgroundColor: Colors.blue, body: SafeArea( child: SingleChildScrollView( physics: ClampingScrollPhysics(), child: Align( alignment: Alignment.center, child: Container( width: Get.width, height: Get.width * 16 / 9, child: Stack( children: [ Positioned(top: 16, left: 16, child: BackButton()), Positioned( left: 0, bottom: 0, child: IconButton( padding: EdgeInsets.zero, constraints: BoxConstraints(), materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, icon: Icon( Icons.delete_forever, color: Colors.greenAccent, size: 32, ), onPressed: () { }, ), ), ], ), ), ), ), ), ); }
内容的提问来源于stack exchange,提问作者David Foie Gras
相关产品推荐
相关产品推荐

