improve ContainerRenderObjectMixin
error message when parentData
is not set up properly (#157846)
Previously when subclassing `MultiChildRenderObjectWidget` and `RenderObject with ContainerRenderObjectMixin`, if one forgot to set up parent data, the error message does not give hint that `setupParentData` need to be implemented by the `RenderObject`. This PR add assertion that check parent data type before type cast and give hints if it is was not properly set. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [ ] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
This commit is contained in:
parent
bc0b62a2ab
commit
a0ba2decab
@ -4353,6 +4353,12 @@ mixin ContainerRenderObjectMixin<ChildType extends RenderObject, ParentDataType
|
||||
assert(child != _firstChild);
|
||||
assert(child != _lastChild);
|
||||
adoptChild(child);
|
||||
assert(
|
||||
child.parentData is ParentDataType,
|
||||
'A child of $runtimeType has parentData of type ${child.parentData.runtimeType}, '
|
||||
'which does not conform to $ParentDataType. Class using ContainerRenderObjectMixin '
|
||||
'should override setupParentData() to set parentData to type $ParentDataType.',
|
||||
);
|
||||
_insertIntoChildList(child, after: after);
|
||||
}
|
||||
|
||||
|
@ -377,6 +377,25 @@ void main() {
|
||||
root.buildScene(ui.SceneBuilder()).dispose();
|
||||
expect(calledBack, true);
|
||||
});
|
||||
|
||||
test('ContainerParentDataMixin asserts parentData type', () {
|
||||
final TestRenderObject renderObject = TestRenderObjectWithoutSetupParentData();
|
||||
final TestRenderObject child = TestRenderObject();
|
||||
expect(
|
||||
() => renderObject.add(child),
|
||||
throwsA(
|
||||
isA<AssertionError>().having(
|
||||
(AssertionError error) => error.toString(),
|
||||
'description',
|
||||
contains(
|
||||
'A child of TestRenderObjectWithoutSetupParentData has parentData of type ParentData, '
|
||||
'which does not conform to TestRenderObjectParentData. Class using ContainerRenderObjectMixin '
|
||||
'should override setupParentData() to set parentData to type TestRenderObjectParentData.'
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -485,6 +504,16 @@ class TestRenderObject extends RenderObject with ContainerRenderObjectMixin<Test
|
||||
}
|
||||
}
|
||||
|
||||
class TestRenderObjectWithoutSetupParentData extends TestRenderObject {
|
||||
@override
|
||||
void setupParentData(RenderObject child) {
|
||||
// Use a mismatched parent data type.
|
||||
if (child.parentData is! ParentData) {
|
||||
child.parentData = ParentData();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class LeaderLayerRenderObject extends RenderObject {
|
||||
LeaderLayerRenderObject();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user