flutter_hooks en Flutter: ejercicio resuelto con useState y useEffect
flutter_hooks en Flutter: ejercicio resuelto con useState y useEffect
flutter_hooks lleva el patrón de hooks de React a Flutter. En lugar de extender StatefulWidget + State, extiendes HookWidget y llamas a funciones use* dentro del build. El resultado es menos código repetitivo y mejor reutilización de lógica con estado.
Enunciado
Implementa tres pantallas con flutter_hooks:
- Cronómetro:
useStatepara tiempo transcurrido,useEffectpara elTimer. - Buscador reactivo:
useTextEditingController+useMemoizedpara filtrar lista sinStatefulWidget. - Hook personalizado:
useCountdownreutilizable desde cualquierHookWidget.
Dependencias
Solución completa
Comparativa HookWidget vs StatefulWidget
| Aspecto | StatefulWidget | HookWidget |
|---|---|---|
| Boilerplate | createState(), State, dispose() | Solo build() + llamadas use* |
| Reutilización de lógica | Mixins o extracción a clases | Hook personalizado (función pura) |
| Cleanup de recursos | dispose() manual | Retorno de función en useEffect |
| Testabilidad | Normal | Normal (mismos widget tests) |
| Curva de aprendizaje | Baja | Media (hay que entender las reglas de hooks) |
Reglas de los hooks
- Solo llama hooks dentro de
HookWidget.build. - Nunca dentro de condicionales, bucles o callbacks.
- El orden de llamada debe ser siempre el mismo en cada build.
Errores frecuentes
- Hook fuera de
HookWidget: lanzaHookNotFoundError. Asegúrate de extenderHookWidgeten vez deStatelessWidget. - Dependencias vacías con efecto que usa variables: si el
useEffectcaptura una variable pero su lista de dependencias esconst [], el efecto no se re-ejecuta. Añade la variable a la lista. useMemoizedcon lista mutable: si pasas unListcomo dependencia, compara por referencia. Usa valores primitivos o genera un hash explícito.
Aplicación práctica
flutter_hooks encaja bien en apps donde tienes muchos StatefulWidget pequeños con Timer, AnimationController o TextEditingController. Elimina el dispose manual y reduce la superficie de bugs por recursos no liberados.
Siguiente ejercicio recomendado
- Animaciones implícitas en Flutter: ejercicio resuelto
- AnimationController y Tween en Flutter: ejercicio resuelto
- Todos los ejercicios de Flutter
Práctica guiada y siguiente paso
FAQ
¿flutter_hooks es compatible con Riverpod o BLoC?
Sí. Existe hooks_riverpod que combina ambos paquetes. Para BLoC, simplemente usa HookWidget y accede al BLoC vía context.read/context.watch de forma normal.
¿Puedo mezclar HookWidget con StatefulWidget en el mismo árbol?
Sí, son completamente compatibles. Puedes migrar gradualmente pantalla a pantalla.
¿Los hooks afectan el rendimiento?
No negativamente. Internamente usan el mismo mecanismo que StatefulWidget. El código resultante es equivalente en rendimiento pero más compacto.