Flutter 行内图标垂直居中对齐及底部导航栏布局调整问题
修复方案
核心修改点如下:
- 滑块区域布局优化:将Slider用
Expanded包裹,无需硬算宽度,自动占满行内剩余空间,同时通过SliderThemeData去除Slider默认的内置边距,即可缩小时间文本与滑块的间距 - 图标区域布局优化:将原本的
Wrap替换为Row,设置crossAxisAlignment: CrossAxisAlignment.center保证所有图标垂直居中,用mainAxisAlignment: MainAxisAlignment.spaceEvenly实现图标均匀分布,同时统一所有IconButton的padding参数,避免播放按钮单独设置padding导致的错位 - 调整整体容器的边距参数,适配100高度的底部导航栏空间
修改后的完整代码如下:
bottomNavigationBar: ValueListenableBuilder( valueListenable: hiding.visible, builder: (context, bool value, child) => AnimatedContainer( color: light_mode? const Color(0xFFFFFFFF) : const Color(0xFF616161), duration: const Duration(milliseconds: 500), height: value ? 100 : 0.0, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ // 滑块时间区域 Container( margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 2), height: 30, width: MediaQuery.of(context).size.width, child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ Text("0:00", style: TextStyle(color: light_mode ? Colors.black : Colors.white70),), // Expanded自动占满剩余空间,无需硬算宽度 Expanded( child: SliderTheme( data: SliderThemeData( thumbColor: light_mode? const Color(0xFF6A0080) : Colors.black, activeTrackColor: light_mode?const Color(0xFF6A0080) : Colors.black, inactiveTrackColor: Colors.grey, trackHeight: 1.0, // 去除Slider默认的内置边距,缩小和文本的间距 overlayShape: SliderComponentShape.noOverlay, trackShape: const RectangularSliderTrackShape(), thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 6), ), child: Slider( value: 60.0, max: 100.0, min: 0.0, onChanged: (double newValue) { setState(() { // sliderValue = newValue.round(); }); }, ) ), ), Text("0:00", style: TextStyle(color: light_mode ? Colors.black : Colors.white70),) ], ), ), // 图标控制区域 Container( margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 4), height: 48, width: MediaQuery.of(context).size.width, // 替换Wrap为Row,更适合均匀分布图标 child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[ IconButton( padding: EdgeInsets.zero, icon: Icon( Icons.skip_previous, color: Colors.grey, size: 30, ), onPressed: () { // do something }, ), IconButton( // 移除单独设置的padding,和其他按钮统一 padding: EdgeInsets.zero, icon: Icon( Icons.play_circle_fill_rounded, color: light_mode? const Color(0xFFEA80FC) : const Color(0xFF6D6D6D) , size: 45, ), onPressed: () { // do something }, ), IconButton( padding: EdgeInsets.zero, icon: Icon( Icons.skip_next, color: Colors.grey, size: 30, ), onPressed: () { // do something }, ), IconButton( padding: EdgeInsets.zero, icon: Icon( Icons.bookmark_border_outlined, color: Colors.grey, size: 35.0, ), onPressed: () { // do something }, ), IconButton( padding: EdgeInsets.zero, icon: Icon( Icons.share_rounded, color: Colors.grey, size: 30, ), onPressed: () { // do something }, ) ], ), ) ], ), ) ),
另外你原本最外层用了Wrap来装两个Container,我替换成了Column,布局逻辑更清晰,也避免Wrap在不同设备尺寸下可能出现的换行错位问题。
内容的提问来源于stack exchange,提问作者Noor
相关产品推荐
相关产品推荐

