The forgetChild() method must call super
Summary
A recent global key duplication detection refactor now requires
Element
subclasses that override the forgetChild()
to call super()
.
Context
When encountering a global key duplication that will be cleaned up by an element rebuild later, we must not report global key duplication. Our previous implementation threw an error as soon as duplication was detected, and didn’t wait for the rebuild if the element with the duplicated global key would have rebuilt.
The new implementation keeps track of all global
key duplications during a build cycle, and only verifies global
key duplication at the end of the that cycle instead of
throwing an error immediately. As part of the refactoring,
we implemented a mechanism to remove previous global key
duplication in forgetChild
if the rebuild had happened.
This, however, requires all Element
subclasses that
override forgetChild
to call the super
method.
Description of change
The forgetChild
of abstract class Element
has a base
implementation to remove global key reservation,
and it is enforced by the @mustCallSuper
meta tag.
All subclasses that override the method have to call super
;
otherwise, the analyzer shows a linting error and
global key duplication detection might throw an unexpected error.
Migration guide
In the following example, an app’s Element
subclass overrides the forgetChild
method.
Code before migration:
class CustomElement extends Element {
@override
void forgetChild(Element child) {
...
}
}
Code after migration:
class CustomElement extends Element {
@override
void forgetChild(Element child) {
...
super.forgetChild(child);
}
}
Timeline
Landed in version: 1.16.3
In stable release: 1.17
References
API documentation:
Relevant issues:
Relevant PRs: