Flutter BottomNavigationBar 如何移除图标与标签的默认内边距?

BottomNavigationBar的图标顶部、标签底部的默认内边距是组件源码硬编码的固定值,没有直接对外暴露的配置项可以一键移除,可通过两种常用方案实现效果:
负边距抵消法(零侵入,不改动现有组件逻辑)
组件内部为所有带label的图标,默认套了固定值的垂直内边距(一般为顶部12dp、底部预留16dp的空间给标签显示),直接在每个BottomNavigationBarItem的icon外层添加反向负内边距,就能把默认占掉的空间抵消掉,实现图标顶到导航栏上沿、标签贴到导航栏下沿的效果。
可直接参考的实现代码:BottomNavigationBar( type: BottomNavigationBarType.fixed, currentIndex: _currentIndex, onTap: (value) => setState(() => _currentIndex = value), items: [ BottomNavigationBarItem( // 抵消组件默认的上下内边距 icon: Padding( padding: const EdgeInsets.only(top: -12, bottom: -16), child: const Icon(Icons.home), ), label: '首页', ), BottomNavigationBarItem( icon: Padding( padding: const EdgeInsets.only(top: -12, bottom: -16), child: const Icon(Icons.person), ), label: '我的', ), ], )注意:不同Flutter版本的硬编码内边距值可能存在小幅调整,实际调试时可根据显示效果微调负边距的数值,直到达到预期的贴边效果。
自定义导航栏实现(完全可控,无版本依赖)
如果不想依赖组件内部的硬编码逻辑,可直接替换默认的BottomNavigationBar,用基础布局组件搭建同等功能的底部导航:
用指定高度的容器作为导航栏基底,内部用横向排列的Row放置所有导航项,每个导航项用Column垂直排布图标和标签,完全自主控制所有元素的上下间距,不存在无法修改的默认内边距。
内容的提问来源于stack exchange,提问作者Ash Khachatryan
相关产品推荐
相关产品推荐

