Freezed y json_serializable en Flutter: ejercicio resuelto
Freezed y json_serializable en Flutter: ejercicio resuelto
Freezed genera automáticamente copyWith, ==, hashCode, toString y fromJson/toJson para tus modelos. Elimina el boilerplate que de otro modo escribirías a mano y que es la fuente de errores más común al trabajar con datos inmutables.
Enunciado
Crea un modelo Post inmutable con id, title, body y isFavorite (con valor por defecto). Demuestra:
- Creación de instancias.
copyWithpara modificar un campo.- Serialización a/desde JSON.
- Un tipo union
ApiResultpara modelar éxito y error.
Dependencias
Cómo ejecutar build_runner
Solución: modelo Post
Solución: tipo union ApiResult
Uso completo en una app
Archivos generados por build_runner
Después de ejecutar build_runner build aparecen dos archivos que no debes editar a mano:
Añade estos patrones a .gitignore si prefieres no versionar los archivos generados (requiere regenerar en CI):
O bien versiónalos para evitar regenerar en cada build de CI.
Errores frecuentes
- Olvidar
part 'post.freezed.dart': el compilador no encuentra los tipos generados y falla con_$Post not found. - No ejecutar build_runner después de un cambio: los archivos
.freezed.dartquedan desactualizados y aparecen errores de tipos. - Modificar un archivo
.freezed.darta mano: se sobreescribe en el siguiente build; cualquier cambio va en el archivo fuente anotado.
Cuándo merece la pena Freezed
- Modelos que viajen por varias capas (API → dominio → UI).
- Modelos que se copian frecuentemente con pequeñas modificaciones.
- Estados de BLoC/Cubit con múltiples variantes (union types).
- Cualquier proyecto de más de un par de semanas.
Aplicación práctica
Freezed es el estándar de facto para modelos de dominio en Flutter. Lo encontrarás en casi todos los proyectos de producción con arquitectura limpia, junto a Riverpod o BLoC.
Siguiente ejercicio recomendado
- json_serializable sin Freezed: ejercicio resuelto
- Mapper DTO a dominio en Flutter: ejercicio resuelto
- Arquitectura por capas 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
¿Tengo que regenerar en cada flutter run?
No. Los archivos generados persisten. Solo regeneras cuando cambias la clase anotada.
¿Freezed es compatible con Riverpod?
Sí, y se complementan muy bien. Los estados de StateNotifier o AsyncNotifier de Riverpod suelen modelarse con Freezed.
¿Puedo usar Freezed sin json_serializable?
Sí. Si no necesitas fromJson/toJson, omite json_annotation y el part '*.g.dart'. Obtendrás copyWith, == y toString igual.