La solution utilise ScrollController et j'ai vu des commentaires sur la page.
Je voudrais partager mes découvertes sur le paquet incrementally_loading_listview. https://github.com/MaikuB/incrementally_loading_listview .
Comme indiqué dans l'emballage : Cela pourrait être utilisé pour charger des données paginées reçues de requêtes API.
Fondamentalement, lorsque ListView construit le dernier élément et que cela signifie que l'utilisateur a fait défiler jusqu'en bas.
J'espère que cela pourra aider quelqu'un qui se pose des questions similaires.
Pour les besoins de la démo, j'ai modifié l'exemple pour qu'une page n'inclue qu'un seul élément et ajouter un CircularProgressIndicator.
...
bool _loadingMore;
bool _hasMoreItems;
int _maxItems = 30;
int _numItemsPage = 1;
...
_hasMoreItems = items.length < _maxItems;
...
return IncrementallyLoadingListView(
hasMore: () => _hasMoreItems,
itemCount: () => items.length,
loadMore: () async {
// can shorten to "loadMore: _loadMoreItems" but this syntax is used to demonstrate that
// functions with parameters can also be invoked if needed
await _loadMoreItems();
},
onLoadMore: () {
setState(() {
_loadingMore = true;
});
},
onLoadMoreFinished: () {
setState(() {
_loadingMore = false;
});
},
loadMoreOffsetFromBottom: 0,
itemBuilder: (context, index) {
final item = items[index];
if ((_loadingMore ?? false) && index == items.length - 1) {
return Column(
children: <Widget>[
ItemCard(item: item),
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
Row(
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
Container(
width: 60.0,
height: 60.0,
color: Colors.grey,
),
Padding(
padding: const EdgeInsets.fromLTRB(
8.0, 0.0, 0.0, 0.0),
child: Container(
color: Colors.grey,
child: Text(
item.name,
style: TextStyle(
color: Colors.transparent),
),
),
)
],
),
Padding(
padding: const EdgeInsets.fromLTRB(
0.0, 8.0, 0.0, 0.0),
child: Container(
color: Colors.grey,
child: Text(
item.message,
style: TextStyle(
color: Colors.transparent),
),
),
)
],
),
),
),
Center(child: CircularProgressIndicator())
],
);
}
return ItemCard(item: item);
},
);
exemple complet https://github.com/MaikuB/incrementally_loading_listview/blob/master/example/lib/main.dart
Package utilise ListView index = dernier élément et loadMoreOffsetFromBottom pour détecter quand charger plus.
itemBuilder: (itemBuilderContext, index) {
if (!_loadingMore &&
index ==
widget.itemCount() -
widget.loadMoreOffsetFromBottom -
1 &&
widget.hasMore()) {
_loadingMore = true;
_loadingMoreSubject.add(true);
}
2 votes
Utilisez
ListView.builder()
et fournir un nombre d'articles plus important que ce qui est déjà chargé. Lorsque l'utilisateur fait défiler la liste jusqu'à un index qui n'a pas encore été chargé, vous chargez les données et présentez à nouveau la liste.0 votes
@GünterZöchbauer Je n'aime pas cette approche car il est beaucoup plus difficile de travailler avec la pagination. Vous ne savez pas à l'intérieur d'un index inconnu s'il se trouve dans la page n+1 ou n+2 par exemple.
0 votes
Cela peut dépendre du cas d'utilisation. Cela a bien fonctionné dans notre projet. Vous pouvez également la combiner avec la position de défilement. Ce que j'aime, c'est que je peux avoir un nombre beaucoup plus important d'éléments chargés et que la barre de défilement le reflète.
0 votes
@GünterZöchbauer Pouvez-vous me donner un exemple de pagination à votre façon ?