From 539f09f801f5f42e59c40c1ed6883638e94e311b Mon Sep 17 00:00:00 2001 From: LongCatIsLooong <31859944+LongCatIsLooong@users.noreply.github.com> Date: Thu, 11 Jul 2019 13:54:51 -0700 Subject: [PATCH] Remove `_debugWillReattachChildren` assertions from `_TableElement` (#34202) --- packages/flutter/lib/src/widgets/table.dart | 20 +-------- packages/flutter/test/widgets/table_test.dart | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/packages/flutter/lib/src/widgets/table.dart b/packages/flutter/lib/src/widgets/table.dart index d5f9564f13..7f823fc144 100644 --- a/packages/flutter/lib/src/widgets/table.dart +++ b/packages/flutter/lib/src/widgets/table.dart @@ -250,13 +250,9 @@ class _TableElement extends RenderObjectElement { List<_TableElementRow> _children = const<_TableElementRow>[]; - bool _debugWillReattachChildren = false; - @override void mount(Element parent, dynamic newSlot) { super.mount(parent, newSlot); - assert(!_debugWillReattachChildren); - assert(() { _debugWillReattachChildren = true; return true; }()); _children = widget.children.map<_TableElementRow>((TableRow row) { return _TableElementRow( key: row.key, @@ -266,32 +262,20 @@ class _TableElement extends RenderObjectElement { }).toList(growable: false), ); }).toList(growable: false); - assert(() { _debugWillReattachChildren = false; return true; }()); _updateRenderObjectChildren(); } @override void insertChildRenderObject(RenderObject child, Element slot) { - assert(_debugWillReattachChildren); renderObject.setupParentData(child); } @override void moveChildRenderObject(RenderObject child, dynamic slot) { - assert(_debugWillReattachChildren); } @override void removeChildRenderObject(RenderObject child) { - assert(() { - if (_debugWillReattachChildren) - return true; - for (Element forgottenChild in _forgottenChildren) { - if (forgottenChild.renderObject == child) - return true; - } - return false; - }()); final TableCellParentData childParentData = child.parentData; renderObject.setChild(childParentData.x, childParentData.y, null); } @@ -300,8 +284,6 @@ class _TableElement extends RenderObjectElement { @override void update(Table newWidget) { - assert(!_debugWillReattachChildren); - assert(() { _debugWillReattachChildren = true; return true; }()); final Map> oldKeyedRows = >{}; for (_TableElementRow row in _children) { if (row.key != null) { @@ -330,7 +312,7 @@ class _TableElement extends RenderObjectElement { updateChildren(oldUnkeyedRows.current.children, const [], forgottenChildren: _forgottenChildren); for (List oldChildren in oldKeyedRows.values.where((List list) => !taken.contains(list))) updateChildren(oldChildren, const [], forgottenChildren: _forgottenChildren); - assert(() { _debugWillReattachChildren = false; return true; }()); + _children = newChildren; _updateRenderObjectChildren(); _forgottenChildren.clear(); diff --git a/packages/flutter/test/widgets/table_test.dart b/packages/flutter/test/widgets/table_test.dart index e96c1ada90..3614d1e22b 100644 --- a/packages/flutter/test/widgets/table_test.dart +++ b/packages/flutter/test/widgets/table_test.dart @@ -19,6 +19,24 @@ class TestStatefulWidgetState extends State { Widget build(BuildContext context) => Container(); } +class TestChildWidget extends StatefulWidget { + const TestChildWidget({ Key key }) : super(key: key); + + @override + TestChildState createState() => TestChildState(); +} + +class TestChildState extends State { + bool toggle = true; + + void toggleMe() { + setState(() { toggle = !toggle; }); + } + + @override + Widget build(BuildContext context) => toggle ? const SizedBox() : const Text('CRASHHH'); +} + void main() { testWidgets('Table widget - empty', (WidgetTester tester) async { await tester.pumpWidget( @@ -855,5 +873,32 @@ void main() { ); }); + // Regression test for https://github.com/flutter/flutter/issues/31473. + testWidgets( + 'Does not crash if a child RenderObject is replaced by another RenderObject of a different type', + (WidgetTester tester) async { + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Table(children: const [TableRow(children: [TestChildWidget()])]), + ), + ); + expect(find.text('CRASHHH'), findsNothing); + + final TestChildState state = tester.state(find.byType(TestChildWidget)); + state.toggleMe(); + + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Table(children: const [TableRow(children: [TestChildWidget()])]), + ), + ); + + // Should not crash. + expect(find.text('CRASHHH'), findsOneWidget); + } + ); + // TODO(ianh): Test handling of TableCell object }