@@ -73,6 +73,65 @@ class ExpandableCarouselState extends State<ExpandableCarousel>
7373 late List <double > _sizes;
7474 Timer ? _timer;
7575
76+ CarouselOptions get options => widget.options;
77+
78+ bool get isBuilder => widget.itemBuilder != null ;
79+
80+ double get _currentSize => _sizes[_currentPage];
81+
82+ double get _previousSize => _sizes[_previousPage];
83+
84+ bool get _isHorizontalScroll =>
85+ widget.options.scrollDirection == Axis .horizontal;
86+
87+ void _changeMode (CarouselPageChangedReason mode) {
88+ mode = mode;
89+ }
90+
91+ void _updatePage () {
92+ final newPage = _pageController? .page! .round ();
93+
94+ WidgetsBinding .instance.addPostFrameCallback ((_) {
95+ if (mounted) {
96+ setState (() {
97+ _firstPageLoaded = true ;
98+ _previousPage = _currentPage;
99+ _currentPage = newPage! ;
100+ });
101+ }
102+ });
103+
104+ // if (_currentPage != newPage) {
105+ // //...
106+ // }
107+ }
108+
109+ void _changeIndexPageDelta () {
110+ var realIndex = getRealIndex (
111+ _carouselState! .pageController! .page! .floor (),
112+ _carouselState! .realPage,
113+ widget.itemCount ?? widget.items? .length,
114+ );
115+
116+ WidgetsBinding .instance.addPostFrameCallback ((_) {
117+ if (mounted) {
118+ setState (() {
119+ _currentPage = realIndex;
120+ _pageDelta = _pageController! .page! - _pageController! .page! .floor ();
121+ });
122+ }
123+ });
124+
125+ // WidgetsBinding.instance.addPostFrameCallback((_) {
126+ // if (mounted) {
127+ // setState(() {
128+ // _currentPage = _pageController!.page!.floor();
129+ // _pageDelta = _pageController!.page! - _pageController!.page!.floor();
130+ // });
131+ // }
132+ // });
133+ }
134+
76135 @override
77136 void didUpdateWidget (covariant ExpandableCarousel oldWidget) {
78137 super .didUpdateWidget (oldWidget);
@@ -93,12 +152,7 @@ class ExpandableCarouselState extends State<ExpandableCarousel>
93152 /// handle autoplay when state changes
94153 _handleAutoPlay ();
95154
96- _pageController? .addListener (() {
97- setState (() {
98- _currentPage = _pageController! .page! .floor ();
99- _pageDelta = _pageController! .page! - _pageController! .page! .floor ();
100- });
101- });
155+ _pageController? .addListener (_changeIndexPageDelta);
102156
103157 if (oldWidget.options.controller != widget.options.controller) {
104158 _pageController? .addListener (_updatePage);
@@ -110,16 +164,6 @@ class ExpandableCarouselState extends State<ExpandableCarousel>
110164 }
111165 }
112166
113- @override
114- void dispose () {
115- _pageController? .removeListener (_updatePage);
116- if (_shouldDisposePageController) {
117- _pageController? .dispose ();
118- }
119- _clearTimer ();
120- super .dispose ();
121- }
122-
123167 @override
124168 void initState () {
125169 super .initState ();
@@ -151,12 +195,7 @@ class ExpandableCarouselState extends State<ExpandableCarousel>
151195
152196 _carouselState! .pageController = _pageController;
153197
154- _pageController! .addListener (() {
155- setState (() {
156- _currentPage = _pageController! .page! .floor ();
157- _pageDelta = _pageController! .page! - _pageController! .page! .floor ();
158- });
159- });
198+ _pageController! .addListener (_changeIndexPageDelta);
160199
161200 _sizes = _prepareSizes ();
162201 _pageController? .addListener (_updatePage);
@@ -165,26 +204,22 @@ class ExpandableCarouselState extends State<ExpandableCarousel>
165204 _shouldDisposePageController = widget.options.controller == null ;
166205 }
167206
207+ @override
208+ void dispose () {
209+ _pageController? .removeListener (_changeIndexPageDelta);
210+ _pageController? .removeListener (_updatePage);
211+ if (_shouldDisposePageController) {
212+ _pageController? .dispose ();
213+ }
214+ _clearTimer ();
215+ super .dispose ();
216+ }
217+
168218 CarouselControllerImpl get carouselController =>
169219 widget.options.controller != null
170220 ? widget.options.controller as CarouselControllerImpl
171221 : CarouselController () as CarouselControllerImpl ;
172222
173- CarouselOptions get options => widget.options;
174-
175- bool get isBuilder => widget.itemBuilder != null ;
176-
177- double get _currentSize => _sizes[_currentPage];
178-
179- double get _previousSize => _sizes[_previousPage];
180-
181- bool get _isHorizontalScroll =>
182- widget.options.scrollDirection == Axis .horizontal;
183-
184- void _changeMode (CarouselPageChangedReason mode) {
185- mode = mode;
186- }
187-
188223 /// Timer
189224 Timer ? _getTimer () {
190225 if (widget.options.autoPlay == true ) {
@@ -303,17 +338,6 @@ class ExpandableCarouselState extends State<ExpandableCarousel>
303338 }
304339 }
305340
306- void _updatePage () {
307- final newPage = _pageController? .page! .round ();
308- if (_currentPage != newPage) {
309- setState (() {
310- _firstPageLoaded = true ;
311- _previousPage = _currentPage;
312- _currentPage = newPage! ;
313- });
314- }
315- }
316-
317341 Widget _itemBuilder (BuildContext context, int index) {
318342 final idx = getRealIndex (
319343 index + _carouselState! .initialPage,
0 commit comments