import 'package:flutter/material.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; class StatusBarWithIndicator extends StatelessWidget { final int selectKey; final List> showLabel; final IconData icon; final double gap; // 每段之间的间距 const StatusBarWithIndicator({ super.key, required this.selectKey, required this.showLabel, this.icon = Icons.favorite, this.gap = 8.0, // 默认 8.rpx 间距 }); @override Widget build(BuildContext context) { return LayoutBuilder(builder: (context, constraints) { final totalWidth = constraints.maxWidth; final itemCount = showLabel.length; // 每条线的宽度 = (总宽度 - 总间隔)/ 项数 final totalGap = (itemCount - 1) * gap.rpx; final itemWidth = (totalWidth - totalGap) / itemCount; // 找到选中项的 index final selectedIndex = showLabel.indexWhere((e) => e['key'] == selectKey); final iconLeft = selectedIndex >= 0 ? selectedIndex * (itemWidth + gap.rpx) + itemWidth / 2 : 0.0; return SizedBox( width: double.infinity, child: Stack( clipBehavior: Clip.none, children: [ if (selectedIndex >= 0) Positioned( left: iconLeft, top: -20.rpx, child: Transform.translate( offset: Offset(-22.5.rpx, 0), // 图片宽度 45.rpx,居中偏移 child: Container( width: 45.rpx, height: 76.rpx, decoration: BoxDecoration( image: DecorationImage( image: AssetImage('assets/img/tip_arrow.gif'), fit: BoxFit.cover, ), ), ), ), ), Padding( padding: EdgeInsets.only(top: 50.rpx), child: Column( children: [ // 条形段(带间距) Row( children: showLabel.asMap().entries.map((entry) { int index = entry.key; var item = entry.value; return Container( width: itemWidth, height: 15.rpx, margin: EdgeInsets.only( left: index == 0 ? 0 : gap.rpx, ), decoration: BoxDecoration( color: item['color'], borderRadius: BorderRadius.circular(0.rpx), ), ); }).toList(), ), SizedBox(height: 12.rpx), // 名称文字 Row( children: showLabel.asMap().entries.map((entry) { int index = entry.key; var item = entry.value; return Container( width: itemWidth, margin: EdgeInsets.only( left: index == 0 ? 0 : gap.rpx, ), alignment: Alignment.center, child: Text( item['name'], style: TextStyle( fontSize: 24.rpx, color: Colors.white, ), textAlign: TextAlign.center, ), ); }).toList(), ), ], ), ), ], ), ); }); } }