Skip to content

Commit

Permalink
improve ContainerRenderObjectMixin error message when parentData
Browse files Browse the repository at this point in the history
…is not set up properly (flutter#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
  • Loading branch information
PurplePolyhedron authored Nov 29, 2024
1 parent bc0b62a commit a0ba2de
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
6 changes: 6 additions & 0 deletions packages/flutter/lib/src/rendering/object.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
29 changes: 29 additions & 0 deletions packages/flutter/test/rendering/object_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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.'
),
),
),
);
});
}


Expand Down Expand Up @@ -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();

Expand Down

0 comments on commit a0ba2de

Please sign in to comment.