import 'package:flutter/material.dart'; import 'dart:math' as math; class PieChartWidget extends StatelessWidget { final double victoryPercentage; final double defeatPercentage; final double drawPercentage; final double sf; const PieChartWidget({ super.key, required this.victoryPercentage, required this.defeatPercentage, this.drawPercentage = 0, required this.sf, }); @override Widget build(BuildContext context) { return LayoutBuilder( builder: (context, constraints) { final double w = constraints.maxWidth.isInfinite ? 100.0 : constraints.maxWidth; final double h = constraints.maxHeight.isInfinite ? 100.0 : constraints.maxHeight; final double size = math.min(w, h); return Center( child: SizedBox( width: size, height: size, child: CustomPaint( painter: _DonutChartPainter( victoryPercentage: victoryPercentage, defeatPercentage: defeatPercentage, drawPercentage: drawPercentage, ), child: Center( child: _buildCenterLabels(size), ), ), ), ); }, ); } Widget _buildCenterLabels(double size) { final bool hasGames = victoryPercentage > 0 || defeatPercentage > 0 || drawPercentage > 0; return Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( // 👇 Casa decimal aplicada aqui! hasGames ? '${(victoryPercentage * 100).toStringAsFixed(1)}%' : '---', style: TextStyle( fontSize: size * (hasGames ? 0.20 : 0.15), fontWeight: FontWeight.bold, color: hasGames ? Colors.white : Colors.white54, ), ), SizedBox(height: size * 0.02), Text( hasGames ? 'Vitórias' : 'Sem Jogos', style: TextStyle( fontSize: size * 0.08, color: hasGames ? Colors.white70 : Colors.white38, ), ), ], ); } } class _DonutChartPainter extends CustomPainter { final double victoryPercentage; final double defeatPercentage; final double drawPercentage; _DonutChartPainter({ required this.victoryPercentage, required this.defeatPercentage, required this.drawPercentage, }); @override void paint(Canvas canvas, Size size) { final center = Offset(size.width / 2, size.height / 2); final radius = (size.width / 2) - (size.width * 0.1); final strokeWidth = size.width * 0.2; if (victoryPercentage == 0 && defeatPercentage == 0 && drawPercentage == 0) { final bgPaint = Paint() ..color = Colors.white.withOpacity(0.05) ..style = PaintingStyle.stroke ..strokeWidth = strokeWidth; canvas.drawCircle(center, radius, bgPaint); return; } const victoryColor = Colors.green; const defeatColor = Colors.red; const drawColor = Colors.amber; double startAngle = -math.pi / 2; void drawDonutSector(double percentage, Color color) { if (percentage <= 0) return; final sweepAngle = 2 * math.pi * percentage; final paint = Paint() ..color = color ..style = PaintingStyle.stroke ..strokeWidth = strokeWidth ..strokeCap = StrokeCap.butt; canvas.drawArc(Rect.fromCircle(center: center, radius: radius), startAngle, sweepAngle, false, paint); startAngle += sweepAngle; } drawDonutSector(victoryPercentage, victoryColor); drawDonutSector(drawPercentage, drawColor); drawDonutSector(defeatPercentage, defeatColor); } @override bool shouldRepaint(covariant CustomPainter oldDelegate) => true; }