@@ -5,7 +5,6 @@ import 'package:paginated_items_builder/src/models/paginated_items_builder_confi
55import 'package:paginated_items_builder/src/models/paginated_items_response.dart' ;
66import 'package:paginated_items_builder/src/pagination_items_state_handler.dart' ;
77import 'package:shimmer/shimmer.dart' ;
8- import 'package:visibility_detector/visibility_detector.dart' ;
98
109/// enum used to check how the list items are to be rendered on the screen.
1110/// Whether in a list view or a grid view.
@@ -27,6 +26,7 @@ class PaginatedItemsBuilder<T> extends StatefulWidget {
2726 required this .itemBuilder,
2827 this .itemsDisplayType = ItemsDisplayType .list,
2928 this .shrinkWrap = false ,
29+ this .disableRefreshIndicator = false ,
3030 this .paginate = true ,
3131 this .showRefreshIcon = true ,
3232 this .neverScrollablePhysicsOnShrinkWrap = true ,
@@ -84,6 +84,11 @@ class PaginatedItemsBuilder<T> extends StatefulWidget {
8484 /// Defaults to false
8585 final bool shrinkWrap;
8686
87+ /// True if you don't want the in-built refresh indicator for your items.
88+ ///
89+ /// Defaults to false.
90+ final bool disableRefreshIndicator;
91+
8792 /// The amount of space by which to inset the children.
8893 final EdgeInsets ? padding;
8994
@@ -155,7 +160,7 @@ class _PaginatedItemsBuilderState<T> extends State<PaginatedItemsBuilder<T>> {
155160 bool _initialLoading = true ;
156161 bool _loadingMoreData = false ;
157162
158- final _loaderKey = UniqueKey () ;
163+ int ? _lastLoaderBuiltIndex ;
159164
160165 late bool showLoader;
161166 late ScrollPhysics ? scrollPhysics;
@@ -191,15 +196,18 @@ class _PaginatedItemsBuilderState<T> extends State<PaginatedItemsBuilder<T>> {
191196
192197 Widget _itemBuilder (context, index) {
193198 if (widget.response? .items != null ) {
194- if (widget.response! .items! .length <= index) return _loaderBuilder ();
199+ // bottom loader
200+ // passing index only for bottom loader, to update [_lastLoaderBuiltIndex]
201+ if (widget.response! .items! .length <= index) return _loaderBuilder (index);
195202 final item = widget.response! .items! [index];
196203 return widget.itemBuilder (context, index, item);
197204 } else {
205+ // initial loader
198206 return _loaderBuilder ();
199207 }
200208 }
201209
202- Widget _loaderBuilder () {
210+ Widget _loaderBuilder ([ int ? index] ) {
203211 final shimmerConfig = PaginatedItemsBuilder .config! .shimmerConfig;
204212
205213 Widget _buildLoader () => mockItem != null
@@ -214,13 +222,16 @@ class _PaginatedItemsBuilderState<T> extends State<PaginatedItemsBuilder<T>> {
214222 )
215223 : widget.loader;
216224
217- return widget.paginate
218- ? VisibilityDetector (
219- key: _loaderKey,
220- onVisibilityChanged: (_) => _fetchData (),
221- child: _buildLoader (),
222- )
223- : _buildLoader ();
225+ if (widget.paginate && index != null ) {
226+ if (_lastLoaderBuiltIndex != index) {
227+ WidgetsBinding .instance? .addPostFrameCallback (
228+ (_) => _fetchData (),
229+ );
230+ _lastLoaderBuiltIndex = index;
231+ }
232+ }
233+
234+ return _buildLoader ();
224235 }
225236
226237 Widget _emptyWidget ([String ? text]) {
@@ -297,7 +308,9 @@ class _PaginatedItemsBuilderState<T> extends State<PaginatedItemsBuilder<T>> {
297308 return _emptyWidget (widget.emptyText);
298309 } else if (widget.response? .items == null && mockItem == null ) {
299310 return _loaderBuilder ();
300- } else if (widget.shrinkWrap || widget.scrollDirection == Axis .horizontal) {
311+ } else if (widget.disableRefreshIndicator ||
312+ widget.shrinkWrap ||
313+ widget.scrollDirection == Axis .horizontal) {
301314 return _buildItems ();
302315 } else {
303316 return RefreshIndicator (
0 commit comments