From 43e3328e98d50568f91254d5db6b863b60c6630f Mon Sep 17 00:00:00 2001 From: Abhishek Ghaskata Date: Wed, 17 Mar 2021 00:48:01 +0530 Subject: [PATCH] Add assertion of recordable list (#76272) --- .../lib/src/material/reorderable_list.dart | 8 ++++++++ .../test/material/reorderable_list_test.dart | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/packages/flutter/lib/src/material/reorderable_list.dart b/packages/flutter/lib/src/material/reorderable_list.dart index d0906053442..58c7c33d532 100644 --- a/packages/flutter/lib/src/material/reorderable_list.dart +++ b/packages/flutter/lib/src/material/reorderable_list.dart @@ -457,6 +457,14 @@ class _ReorderableListContentState extends State<_ReorderableListContent> { Widget _itemBuilder(BuildContext context, int index) { final Widget item = widget.itemBuilder(context, index); + assert(() { + if (item.key == null) { + throw FlutterError( + 'Every item of ReorderableListView must have a key.' + ); + } + return true; + }()); // TODO(goderbauer): The semantics stuff should probably happen inside // _ReorderableItem so the widget versions can have them as well. diff --git a/packages/flutter/test/material/reorderable_list_test.dart b/packages/flutter/test/material/reorderable_list_test.dart index f0e16d4f9ce..0baaace89d2 100644 --- a/packages/flutter/test/material/reorderable_list_test.dart +++ b/packages/flutter/test/material/reorderable_list_test.dart @@ -1326,6 +1326,22 @@ void main() { } expect(items.take(8), orderedEquals([0, 1, 2, 3, 4, 5, 6, 7])); }); + + testWidgets('ReorderableListView throws an error when key is not passed to its children', (WidgetTester tester) async { + final Widget reorderableListView = ReorderableListView.builder( + itemBuilder: (BuildContext context, int index) { + return SizedBox(child: Text('Item $index')); + }, + itemCount: 3, + onReorder: (int oldIndex, int newIndex) { }, + ); + await tester.pumpWidget(MaterialApp( + home: reorderableListView, + )); + final dynamic exception = tester.takeException(); + expect(exception, isFlutterError); + expect(exception.toString(), contains('Every item of ReorderableListView must have a key.')); + }); } Future longPressDrag(WidgetTester tester, Offset start, Offset end) async {