fix(mobile-app): 修复火柴人组件宽度和行间隔问题

1. 将水平边距从16改为20,与其他组件一致
2. 根据火柴人数量动态计算赛道高度,每个火柴人85px
3. 避免火柴人数量标签覆盖到其他火柴人

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2025-12-23 01:10:38 -08:00
parent a9d5d297d8
commit 770bcb85a2
1 changed files with 14 additions and 5 deletions

View File

@ -83,7 +83,7 @@ class _StickmanRaceWidgetState extends State<StickmanRaceWidget>
} }
return Container( return Container(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 8),
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
decoration: BoxDecoration( decoration: BoxDecoration(
color: const Color(0x80FFFFFF), color: const Color(0x80FFFFFF),
@ -159,14 +159,21 @@ class _StickmanRaceWidgetState extends State<StickmanRaceWidget>
); );
} }
/// ++
static const double _minTrackHeight = 85.0;
/// ///
Widget _buildRaceTrack() { Widget _buildRaceTrack() {
// //
final sortedRankings = List<StickmanRankingData>.from(widget.rankings) final sortedRankings = List<StickmanRankingData>.from(widget.rankings)
..sort((a, b) => b.completedCount.compareTo(a.completedCount)); ..sort((a, b) => b.completedCount.compareTo(a.completedCount));
//
final trackCount = sortedRankings.length;
final raceTrackHeight = (trackCount * _minTrackHeight).clamp(160.0, 500.0);
return SizedBox( return SizedBox(
height: 160, height: raceTrackHeight,
child: Stack( child: Stack(
children: [ children: [
// 线 // 线
@ -208,7 +215,7 @@ class _StickmanRaceWidgetState extends State<StickmanRaceWidget>
...sortedRankings.asMap().entries.map((entry) { ...sortedRankings.asMap().entries.map((entry) {
final index = entry.key; final index = entry.key;
final data = entry.value; final data = entry.value;
return _buildStickman(data, index, sortedRankings.length); return _buildStickman(data, index, sortedRankings.length, raceTrackHeight);
}), }),
], ],
), ),
@ -216,12 +223,14 @@ class _StickmanRaceWidgetState extends State<StickmanRaceWidget>
} }
/// ///
Widget _buildStickman(StickmanRankingData data, int rank, int total) { Widget _buildStickman(StickmanRankingData data, int rank, int total, double raceTrackHeight) {
// () // ()
final horizontalProgress = data.progress; final horizontalProgress = data.progress;
// () // ()
final trackHeight = 120.0 / total; //
final usableHeight = raceTrackHeight - 40;
final trackHeight = usableHeight / total;
final verticalPosition = rank * trackHeight + 10; final verticalPosition = rank * trackHeight + 10;
return AnimatedBuilder( return AnimatedBuilder(