Do not crash if table children are replaced before they are layed out (#82765)

This commit is contained in:
Michael Goderbauer 2021-05-18 00:24:03 -07:00 committed by GitHub
parent e716ac19e8
commit d27a942730
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 2 deletions

View File

@ -392,8 +392,7 @@ class _TableElement extends RenderObjectElement {
@override
void removeRenderObjectChild(RenderBox child, _TableSlot slot) {
final TableCellParentData childParentData = child.parentData! as TableCellParentData;
renderObject.setChild(childParentData.x!, childParentData.y!, null);
renderObject.setChild(slot.column, slot.row, null);
}
final Set<Element> _forgottenChildren = HashSet<Element>();

View File

@ -1000,5 +1000,38 @@ void main() {
expect(table.column(2).last.runtimeType, isNot(toBeReplaced));
});
testWidgets('Do not crash if a child that has not been layed out in a previous build is removed', (WidgetTester tester) async {
// Regression test for https://github.com/flutter/flutter/issues/60488.
Widget buildTable(Key key) {
return Directionality(
textDirection: TextDirection.ltr,
child: Table(
children: <TableRow>[
TableRow(
children: <Widget>[
KeyedSubtree(
key: key,
child: const Text('Hello'),
),
],
),
],
),
);
}
await tester.pumpWidget(
buildTable(const ValueKey<int>(1)),
null, EnginePhase.build, // Children are not layed out!
);
await tester.pumpWidget(
buildTable(const ValueKey<int>(2)),
);
expect(tester.takeException(), isNull);
expect(find.text('Hello'), findsOneWidget);
});
// TODO(ianh): Test handling of TableCell object
}