diff --git a/packages/flutter/lib/src/foundation/basic_types.dart b/packages/flutter/lib/src/foundation/basic_types.dart index e1506541b8..4271b6a4c5 100644 --- a/packages/flutter/lib/src/foundation/basic_types.dart +++ b/packages/flutter/lib/src/foundation/basic_types.dart @@ -181,6 +181,22 @@ class CachingIterable extends IterableBase { return _results.length; } + @override + E elementAt(int index) { + RangeError.checkNotNegative(index, 'index'); + while (_results.length <= index) { + if (!_fillNext()) { + throw IndexError.withLength( + index, + _results.length, + indexable: this, + name: 'index', + ); + } + } + return _results[index]; + } + @override List toList({ bool growable = true }) { _precacheEntireList(); diff --git a/packages/flutter/test/foundation/caching_iterable_test.dart b/packages/flutter/test/foundation/caching_iterable_test.dart index 8c2ff147cf..95f6d7e288 100644 --- a/packages/flutter/test/foundation/caching_iterable_test.dart +++ b/packages/flutter/test/foundation/caching_iterable_test.dart @@ -107,4 +107,19 @@ void main() { expect(expanded2, equals([1, 1, 2, 2, 3, 3, 4, 4, 5, 5])); expect(yieldCount, equals(5)); }); + + test('The Caching Iterable: elementAt correctness', () { + final Iterable integers = CachingIterable(range(1, 5).iterator); + expect(yieldCount, equals(0)); + + expect(() => integers.elementAt(-1), throwsRangeError); + + expect(integers.elementAt(1), equals(2)); + expect(integers.elementAt(0), equals(1)); + expect(integers.elementAt(2), equals(3)); + expect(integers.elementAt(4), equals(5)); + expect(integers.elementAt(3), equals(4)); + + expect(() => integers.elementAt(5), throwsRangeError); + }); }