ListTile.divideTiles only run Iterable once (#78879)
diff --git a/packages/flutter/lib/src/material/list_tile.dart b/packages/flutter/lib/src/material/list_tile.dart
index fbdacd8..730a3f4 100644
--- a/packages/flutter/lib/src/material/list_tile.dart
+++ b/packages/flutter/lib/src/material/list_tile.dart
@@ -980,11 +980,11 @@
assert(tiles != null);
assert(color != null || context != null);
- if (tiles.isEmpty)
- return;
-
final Iterator<Widget> iterator = tiles.iterator;
- final bool isNotEmpty = iterator.moveNext();
+ final bool hasNext = iterator.moveNext();
+
+ if (!hasNext)
+ return;
final Decoration decoration = BoxDecoration(
border: Border(
@@ -1001,7 +1001,7 @@
);
tile = iterator.current;
}
- if (isNotEmpty)
+ if (hasNext)
yield tile;
}
diff --git a/packages/flutter/test/material/list_tile_test.dart b/packages/flutter/test/material/list_tile_test.dart
index 220fabb..8b4947e 100644
--- a/packages/flutter/test/material/list_tile_test.dart
+++ b/packages/flutter/test/material/list_tile_test.dart
@@ -257,6 +257,20 @@
expect(output, isEmpty);
});
+ testWidgets('ListTile.divideTiles only runs the generator once', (WidgetTester tester) async {
+ // Regression test for https://github.com/flutter/flutter/pull/78879
+ int callCount = 0;
+ Iterable<Widget> generator() sync* {
+ callCount += 1;
+ yield const Text('');
+ yield const Text('');
+ }
+
+ final List<Widget> output = ListTile.divideTiles(tiles: generator(), color: Colors.grey).toList();
+ expect(output, hasLength(2));
+ expect(callCount, 1);
+ });
+
testWidgets('ListTileTheme', (WidgetTester tester) async {
final Key titleKey = UniqueKey();
final Key subtitleKey = UniqueKey();