Flutter如何去除Column组件子元素间的默认间距
如何去除Column组件间的多余间距
该效果完全可以实现,你看到的多余间距不是Column组件默认生成的,是Row内的Checkbox组件自带的内置留白、默认触摸热区尺寸撑出来的空隙。
问题原因
Flutter的Material风格Checkbox为了符合无障碍触摸规范,默认会带48x48的最小点击响应区域,同时控件本身有默认内边距,哪怕你没给Column、Row设置任何间距,Checkbox自身占的额外高度也会把Row撑出多余空隙,看起来就像两个Row之间有留白。
解决方法
按优先级试以下调整即可:
- 先给Column设置
mainAxisSize: MainAxisSize.min,确保Column自身不会占据多余纵向空间 - 给每个Checkbox配置两个属性,压缩自带的留白和触摸热区:
- 把
materialTapTargetSize设为MaterialTapTargetSize.shrinkWrap,移除默认的48px最小触摸目标占位 - 把
visualDensity设为VisualDensity.compact,压缩控件内置的冗余内边距
- 把
- 如果调完属性还有细微空隙,直接用
SizedBox包裹Checkbox,强制限定它的宽高和视觉尺寸一致(一般Checkbox默认视觉尺寸是24x24)
修改后的参考代码
child: Column( mainAxisSize: MainAxisSize.min, // 关键:Column不要占多余纵向空间 children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox( width: 24, height: 24, // 强制限定Checkbox占位尺寸,消除额外留白 child: Checkbox( materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, // 收缩触摸热区 visualDensity: VisualDensity.compact, // 紧凑模式 checkColor: Colors.green, activeColor: Colors.green, value: value, onChanged: (newVal) { value = newVal; }), ), Text( 'One', style: GoogleFonts.montserrat(fontSize: 18), ), ], ), Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox( width: 24, height: 24, child: Checkbox( materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, visualDensity: VisualDensity.compact, checkColor: Colors.green, activeColor: Colors.green, value: value, onChanged: (newVal) { value = newVal; }), ), Text( 'two', style: GoogleFonts.montserrat(fontSize: 18), ), ], ), ], )
如果用上面的方法还是有细微间距,可以检查下是否外层父组件给了默认内边距,比如Scaffold、Padding组件的默认参数。
内容的提问来源于stack exchange,提问作者user16357470
相关产品推荐
相关产品推荐

