CustomPainter en Flutter: ejercicio resuelto
CustomPainter en Flutter: ejercicio resuelto
Cuando un widget estándar no es suficiente, CustomPainter te da acceso directo al Canvas para dibujar formas, trayectorias y texto con control total del píxel. Se usa en gráficos, indicadores animados, firmas digitales y efectos visuales personalizados.
Enunciado
Implementa dos painters:
RingProgressPainter: un anillo de progreso circular (como los de salud o carga).BarChartPainter: un gráfico de barras simple con etiquetas de valor.
Conecta ambos a un Slider para que el valor cambie en tiempo real.
Dependencias
Solo Flutter SDK — sin paquetes externos.
Solución: RingProgressPainter
Solución: BarChartPainter
Solución: pantalla completa
Resultado esperado
- El anillo muestra el porcentaje en el centro y el arco verde crece al mover el slider.
- El gráfico de barras muestra 6 columnas con etiquetas de día.
- Ambos se repintan fluidamente gracias a
shouldRepaint.
Cómo funciona shouldRepaint
Flutter llama a paint solo si shouldRepaint devuelve true. Comparar los campos que cambian evita repaints innecesarios y mantiene el rendimiento a 60/120 fps.
Errores frecuentes
- No implementar
shouldRepaint: siempre retornartrueprovoca repaint en cada frame aunque nada haya cambiado. - Crear
Paint()dentro depaint(): los objetosPaintson ligeros pero crea instancias en cada repaint. Muévelos a camposfinalsi el painter no es stateful. - Coordenadas relativas al centro:
canvas.drawArcusa unRect, no el centro. Calcula siempreOffset(size.width/2, size.height/2).
Cuándo usar CustomPainter
| Situación | Mejor opción |
|---|---|
| Gráfico a medida | CustomPainter |
| Animación compleja | CustomPainter + AnimationController |
| Gráfico de producción completo | fl_chart / syncfusion_flutter_charts |
| Formas decorativas simples | Container + BoxDecoration |
Aplicación práctica
CustomPainter se usa en indicadores de progreso de onboarding, gráficos de analítica, firmas en pantalla, mapas de calor y cualquier efecto que los widgets estándar no pueden conseguir.
Siguiente ejercicio recomendado
- SliverAppBar collapsible en Flutter: ejercicio resuelto
- Animaciones implícitas en Flutter: ejercicio resuelto
- Rendimiento y rebuilds en Flutter: ejercicio resuelto
- Todos los ejercicios de Flutter
Práctica guiada y siguiente paso
- Más ejercicios de Flutter
- Ejercicios C para reforzar fundamentos
- Programación en C en 100 ejercicios resueltos
- Ver el libro en Amazon (incluido en Kindle Unlimited)
- Suscribirte a la newsletter
FAQ
¿CustomPainter funciona con animaciones?
Sí. Pasa un AnimationController como parámetro, añade ..addListener(notifyListeners) en initState y el painter se repintará cada frame de la animación.
¿Cómo hago hit testing con CustomPainter?
Sobrescribe hitTest(Offset position) en el painter y devuelve true si la posición está dentro de un área interactiva. Luego envuelve el CustomPaint en un GestureDetector.
¿Puedo usar CustomPainter dentro de un ListView?
Sí, pero define un tamaño explícito con SizedBox o AspectRatio. Sin tamaño acotado, el canvas tendrá dimensión infinita y lanzará un error de layout.