Guard against zero item extent for carousel (#163310)
This PR fixes a bug where the `CarouselView` would throw an error if the itemExtent is zero. Part of https://github.com/flutter/flutter/issues/160679 *If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].* ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
This commit is contained in:
parent
0b96fa88fd
commit
d8100ac5ed
@ -579,6 +579,10 @@ class _RenderSliverFixedExtentCarousel extends RenderSliverFixedExtentBoxAdaptor
|
|||||||
|
|
||||||
// This implements the [itemExtentBuilder] callback.
|
// This implements the [itemExtentBuilder] callback.
|
||||||
double _buildItemExtent(int index, SliverLayoutDimensions currentLayoutDimensions) {
|
double _buildItemExtent(int index, SliverLayoutDimensions currentLayoutDimensions) {
|
||||||
|
if (maxExtent == 0.0) {
|
||||||
|
return maxExtent;
|
||||||
|
}
|
||||||
|
|
||||||
final int firstVisibleIndex = (constraints.scrollOffset / maxExtent).floor();
|
final int firstVisibleIndex = (constraints.scrollOffset / maxExtent).floor();
|
||||||
|
|
||||||
// Calculate how many items have been completely scroll off screen.
|
// Calculate how many items have been completely scroll off screen.
|
||||||
@ -641,6 +645,10 @@ class _RenderSliverFixedExtentCarousel extends RenderSliverFixedExtentBoxAdaptor
|
|||||||
double itemExtent,
|
double itemExtent,
|
||||||
int index,
|
int index,
|
||||||
) {
|
) {
|
||||||
|
if (maxExtent == 0.0) {
|
||||||
|
return maxExtent;
|
||||||
|
}
|
||||||
|
|
||||||
final int firstVisibleIndex = (constraints.scrollOffset / maxExtent).floor();
|
final int firstVisibleIndex = (constraints.scrollOffset / maxExtent).floor();
|
||||||
|
|
||||||
// If there is not enough space to place the last visible item but the remaining
|
// If there is not enough space to place the last visible item but the remaining
|
||||||
@ -673,6 +681,10 @@ class _RenderSliverFixedExtentCarousel extends RenderSliverFixedExtentBoxAdaptor
|
|||||||
)
|
)
|
||||||
double itemExtent,
|
double itemExtent,
|
||||||
) {
|
) {
|
||||||
|
if (maxExtent == 0.0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
final int firstVisibleIndex = (constraints.scrollOffset / maxExtent).floor();
|
final int firstVisibleIndex = (constraints.scrollOffset / maxExtent).floor();
|
||||||
return math.max(firstVisibleIndex, 0);
|
return math.max(firstVisibleIndex, 0);
|
||||||
}
|
}
|
||||||
|
@ -1413,6 +1413,25 @@ void main() {
|
|||||||
expect(buttonPressed, isTrue);
|
expect(buttonPressed, isTrue);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Regression test for https://github.com/flutter/flutter/issues/160679
|
||||||
|
testWidgets('CarouselView does not crash if itemExtent is zero', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: Scaffold(
|
||||||
|
body: SizedBox(
|
||||||
|
width: 100,
|
||||||
|
child: CarouselView(
|
||||||
|
itemExtent: 0,
|
||||||
|
children: <Widget>[Container(color: Colors.red, width: 100, height: 100)],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(tester.takeException(), isNull);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Finder getItem(int index) {
|
Finder getItem(int index) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user