Saltar al contenido principal

Se agregó el método dispose() faltante para algunos objetos desechables en Flutter

'dispose()' podría fallar debido a una doble liberación.

Resumen

#

Se han añadido las llamadas faltantes a 'dispose()' para algunos objetos desechables. Por ejemplo, ContextMenuController no liberaba OverlayEntry, y EditableTextState no liberaba TextSelectionOverlay.

Si algún otro código también invoca 'dispose()' para el objeto, y el objeto está protegido contra la doble liberación, el segundo 'dispose()' fallará con el siguiente mensaje de error:

Once you have called dispose() on a <class name>, it can no longer be used.

Contexto

#

La convención es que el propietario de un objeto debe liberarlo (dispose).

Esta convención se rompió en algunos lugares: los propietarios no estaban liberando los objetos desechables. El problema se solucionó agregando una llamada a dispose(). Sin embargo, si el objeto está protegido contra la doble liberación, esto puede causar fallos al ejecutarse en modo debug y cuando se llama a dispose() en otra parte del objeto.

Guía de migración

#

Si encuentras el siguiente error, actualiza tu código para llamar a dispose() solo en los casos en que tu código haya creado el objeto.

Once you have called dispose() on a <class name>, it can no longer be used.

Código antes de la migración:

dart
x.dispose();

Código después de la migración:

dart
if (xIsCreatedByMe) {
  x.dispose();
}

Para localizar la liberación incorrecta, comprueba la pila de llamadas (call stack) del error. Si la pila de llamadas apunta a dispose en tu código, esta liberación es incorrecta y debería corregirse.

Si el error ocurre en el código de Flutter, dispose() fue llamado incorrectamente la primera vez.

Puedes localizar la llamada incorrecta llamando temporalmente a print(StackTrace.current) en el cuerpo del método dispose fallido.

Timeline

#

Consulta el progreso y el estado en el issue de seguimiento.