[CarouselView] Crash (RangeError / ArgumentError) when children or itemCount is empty with infinite: true or CarouselController.animateToItem
メンテナーはふだん 1 日以内に返信
評価
調査の方向性
クラッシュは packages/flutter/lib/src/material/carousel.dart で発生しています。具体的には _CarouselViewState._buildSliverCarousel の childCount 式(infinite が null を強制する部分)と、CarouselController.animateToItem および _getTargetOffset の index.clamp(0, itemCount - 1) のロジックです。まず issue にある children が空のスニペットで再現させ、そのうえで空のケースをガードしてください。完了条件は、空の無限カルーセルが例外なく描画されること、itemCount が 0 のとき itemBuilder が呼ばれないこと、そして animateToItem(0) が何もしないことです。
索引モデルが issue の本文から書いたものです。
説明
Steps to reproduce
- Create a
CarouselVieworCarouselView.weightedwithinfinite: trueand an empty list of children:children: const <Widget>[]. - Run the application. Notice it immediately throws an unhandled
RangeError (length): Invalid value: Valid value range is empty: 0during layout when constructing item 0. - Alternatively, create a
CarouselView.builderwithinfinite: trueanditemCount: 0. Notice the builder is invoked with indices 0, 1, 2, 3... despiteitemCount == 0. - Alternatively, create a
CarouselViewwith aCarouselControllerand an empty list of children (oritemCount: 0), and callcontroller.animateToItem(0). Notice it throws an unhandledArgumentError: 'lowerLimit' (0) cannot be greater than 'upperLimit' (-1).
Expected results
- When
infinite: trueandchildren.isEmpty(oritemCount == 0),CarouselView/CarouselView.weighted/CarouselView.buildershould render an empty scrollable viewport without throwing exceptions (matching the behavior wheninfinite: false). CarouselView.buildershould not invokeitemBuilderwhenitemCount == 0.CarouselController.animateToItemshould safely early-return or no-op when there are no items to animate to, rather than throwing anArgumentErrorfromindex.clamp(0, itemCount - 1).
Actual results
-
For
CarouselViewandCarouselView.weightedwithinfinite: trueandchildren: const <Widget>[]:══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ The following RangeError was thrown building: RangeError (length): Invalid value: Valid value range is empty: 0 When the exception was thrown, this was the stack: #0 _Array.[] (dart:core-patch/array.dart) #1 _CarouselViewState._buildCarouselItem (package:flutter/src/material/carousel.dart:635:38) #2 _CarouselViewState._buildSliverCarousel.<anonymous closure> (package:flutter/src/material/carousel.dart:686:63) #3 SliverChildBuilderDelegate.build (package:flutter/src/widgets/scroll_delegate.dart:553:22) #4 SliverMultiBoxAdaptorElement._build (package:flutter/src/widgets/sliver.dart:1061:28) -
For
CarouselView.builderwithinfinite: trueanditemCount: 0:
itemBuilderis called with indices 0, 1, 2, 3... -
For
CarouselController.animateToItem(0)on an emptyCarouselView:ArgumentError: 'lowerLimit' (0) cannot be greater than 'upperLimit' (-1) package:flutter/src/material/carousel.dart:1972:25: CarouselController.animateToItem
Root Cause
In packages/flutter/lib/src/material/carousel.dart:
-
In
_CarouselViewState._buildSliverCarousel:final int? childCount = widget.infinite ? null : widget.itemBuilder != null ? widget.itemCount : widget.children.length;When
widget.infiniteis true,childCountis unconditionally set tonulleven ifchildren.isEmptyoritemCount == 0. As a result, the sliver delegate builds child index 0:Widget contents = widget.children[index];which throws
RangeError (length)becausewidget.childrenis empty.
Additionally, in builder mode,childCount: nullcausesitemBuilderto be invoked indefinitely even thoughitemCount == 0. -
In
CarouselController.animateToItem(and_getTargetOffset):if (_carouselState!.widget.itemBuilder != null) { final int? itemCount = _carouselState!.widget.itemCount; index = itemCount != null ? index.clamp(0, itemCount - 1) : 0; } else { index = index.clamp(0, _carouselState!.widget.children.length - 1); }When
itemCount == 0orchildren.length == 0,itemCount - 1evaluates to-1, leading toindex.clamp(0, -1), which throwsArgumentError: 'lowerLimit' (0) cannot be greater than 'upperLimit' (-1).
Code sample
Code sample
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(home: CarouselEmptyRepro()));
}
class CarouselEmptyRepro extends StatelessWidget {
const CarouselEmptyRepro({super.key});
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Center(
child: SizedBox(
height: 200,
child: CarouselView(
itemExtent: 200.0,
infinite: true,
children: <Widget>[], // Throws RangeError (length): Invalid value: Valid value range is empty: 0
),
),
),
);
}
}
Screenshots or Video
N/A
Logs
Logs
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following RangeError was thrown building:
RangeError (length): Invalid value: Valid value range is empty: 0
When the exception was thrown, this was the stack:
#0 _Array.[] (dart:core-patch/array.dart)
#1 _CarouselViewState._buildCarouselItem (package:flutter/src/material/carousel.dart:635:38)
#2 _CarouselViewState._buildSliverCarousel.<anonymous closure> (package:flutter/src/material/carousel.dart:686:63)
#3 SliverChildBuilderDelegate.build (package:flutter/src/widgets/scroll_delegate.dart:553:22)
#4 SliverMultiBoxAdaptorElement._build (package:flutter/src/widgets/sliver.dart:1061:28)
#5 SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1077:55)
#6 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3121:19)
#7 SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1067:12)
#8 RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:367:23)
#9 RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:3049:17)
#10 PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:1225:15)
#11 RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:3048:14)
#12 RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:356:5)
#13 RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:454:5)
#14 RenderSliverFixedExtentBoxAdaptor.performLayout (package:flutter/src/rendering/sliver_fixed_extent_list.dart:369:12)
Flutter Doctor output
Doctor output
[✓] Flutter (Channel master, 3.51.0-1.0.pre-38, on Fedora Linux 45 (KDE Plasma Desktop Edition Prerelease) 7.2.9-300.fc45.x86_64, locale en_US.UTF-8)
• Flutter version 3.51.0-1.0.pre-38 on channel master at /home/assassinaj602/Projects/New folder (4)/github_pr/flutter
• Framework revision f7b47b2188 (3 hours ago), 2026-11-03 05:13:25 +0000
• Engine revision f7b47b2188
• Dart version 3.15.0 (build 3.15.0-101.0.dev)
• DevTools version 2.62.0-dev.0
[✓] Android toolchain - develop for Android devices (Android SDK version 36.0.0)
• Android SDK at /home/assassinaj602/Android/Sdk
• Emulator version 37.1.11.0 (build_id 15917651) (CL:N/A)
• Platform android-36, build-tools 36.0.0
[✓] Chrome - develop for the web
• Chrome at google-chrome
[✓] Linux toolchain - develop for Linux desktop
• clang version 23.1.2 (Fedora 23.1.2-2.fc45)
• cmake version 4.3.0
• ninja version 1.13.2
• pkg-config version 2.5.1
[✓] Connected device (2 available)
• Linux (desktop) • linux • linux-x64 • Fedora Linux 45 (KDE Plasma Desktop Edition Prerelease) 7.2.9-300.fc45.x86_64
• Chrome (web) • chrome • web-javascript • Google Chrome 154.0.8037.97
[✓] Network resources
• All expected network resources are available.
- 主要言語
- Dart
- スター
- 181k
- フォーク
- 33.3k
- 平均マージ
- 1日 22時間
- マージ済み PR(30日)
- 280
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
flutter/flutter のほかの issue
-
[flutter_tools] Chromium crash diagnostic prints only startup output instead of the last 200 linesオープンP2 platform-web team-tool tool triaged-tool
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
waiting for response
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
flutter/flutter#195626 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
waiting for response
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
flutter/flutter#195591 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
[cupertino_ui] A disabled segment doesn't tell screen readers it's disabled対応中かも @joellemd が 2 日前に担当しました。 オープンa: accessibility has reproducible steps p: cupertino_ui package team-design
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
メンテナーはふだん 1 日以内に返信
-
[cupertino_ui] A disabled CupertinoButton doesn't tell screen readers it's disabled対応中かも @joellemd が 2 日前に担当しました。 オープンa: accessibility p: cupertino_ui package team-design
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
flutter/flutter#195514 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
flutter/flutter の issue をすべて見る
似ている issue
-
agent-ready area:testing bug
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
pauljohanneskraft/Acai#479 ·
メンテナーはふだん 3 日以内に返信
-
[genkit_google_genai] Gemini tool call with no arguments fails with "requires a non-null input"対応中かも @kenzieschmoll が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 80/100
genkit-ai/genkit-dart#692 ·
メンテナーはふだん 11 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
-
bug
難易度 1/5 1時間未満 初心者へのやさしさ 85/100
lollipopkit/flutter_server_box#1851 · コメント 1 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
メンテナーはふだん 1 日以内に返信