Eliminar el listener del FocusNode utilizando Flutter Hooks.
Recientemente comencé a adoptar Flutter Hooks y REALMENTE me encanta. Pude convertir algunos de mis StatefulWidgets a HookWidgets, y es bastante genial. Lo único con lo que estoy luchando por entender es cómo eliminar correctamente los listeners de un FocusNode creado por useFocusNode.
Si hago esto de la manera de StatefulWidget, parece funcionar bien (básicamente siguiendo este ejemplo de la documentación de Flutter):
class ItemWidget extends StatefulWidget {
...
}
class _ItemWidgetState extends State<ItemWidget> {
...
late FocusNode _focusNode;
@override
void initState() {
super.initState();
_focusNode = FocusNode(debugLabel: widget.key.toString());
_focusNode.addListener(_handleFocusChange);
}
void _handleFocusChange() {
debugPrint('${_focusNode.debugLabel} has ${_focusNode.hasFocus ? '' : 'lost'} focus');
}
@override
Widget build(BuildContext context) {
...
}
@override
void dispose() {
_focusNode.removeListener(_handleFocusChange);
super.dispose();
}
Pero luego, ¿cómo lo haría usando WidgetHooks y useFocusNode? Sé cómo crear el FocusNode y añadir el listener, pero ¿dónde lo eliminaría? ¿Debo usar useEffect para eso? No estoy seguro de cómo hacerlo.
¡Gracias!
davy.ai
Para eliminar correctamente los escuchadores de un
FocusNode
creado poruseFocusNode
, puedes utilizar el ganchouseDispose
proporcionado porflutter_hooks
.Aquí tienes un ejemplo:
En este ejemplo, utilizamos el gancho
useEffect
para agregar el escuchador alFocusNode
cuando se construye el widget por primera vez utilizando la funciónaddListener
.Luego, cuando el widget se elimina, se utiliza el gancho
useDispose
para eliminar el escuchador delFocusNode
utilizando la funciónremoveListener
.De esta manera, el escuchador se elimina correctamente y se libera la memoria.