Saltar al contenido principal

El método forgetChild() debe llamar a super

Cualquier subclase de Element que sobrescriba forgetChild debe llamar a super.

Resumen

#

Una refactorización reciente de la detección de duplicación de claves globales ahora requiere que las subclases de Element que sobrescriban forgetChild() llamen a super().

Contexto

#

Al encontrar una duplicación de clave global que se limpiará mediante la reconstrucción de un elemento más adelante, no debemos informar la duplicación de clave global. Nuestra implementación anterior lanzaba un error tan pronto como se detectaba la duplicación, y no esperaba a la reconstrucción si el elemento con la clave global duplicada se hubiera reconstruido.

La nueva implementación realiza un seguimiento de todas las duplicaciones de claves globales durante un ciclo de compilación (build cycle), y solo verifica la duplicación de claves globales al final de ese ciclo en lugar de lanzar un error de inmediato. Como parte de la refactorización, implementamos un mecanismo para eliminar la duplicación de clave global anterior en forgetChild si la reconstrucción había ocurrido. Esto, sin embargo, requiere que todas las subclases de Element que sobrescriban forgetChild llamen al método super.

Descripción del cambio

#

El método forgetChild de la clase abstracta Element tiene una implementación base para eliminar la reserva de clave global, y esto se hace cumplir mediante la meta-etiqueta @mustCallSuper. Todas las subclases que sobrescriban el método tienen que llamar a super; de lo contrario, el analizador muestra un error de linting y la detección de duplicación de clave global podría lanzar un error inesperado.

Guía de migración

#

En el siguiente ejemplo, una subclase Element de una aplicación sobrescribe el método forgetChild.

Código antes de la migración:

dart
class CustomElement extends Element {

    @override
    void forgetChild(Element child) {
        ...
    }
}

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

dart
class CustomElement extends Element {

    @override
    void forgetChild(Element child) {
        ...
        super.forgetChild(child);
    }
}

Timeline

#

Lanzado en la versión: 1.16.3
En versión estable: 1.17

Referencias

#

Documentación de la API:

Issues relevantes:

PRs relevantes: