I am trying to get a simple pagination working on Flutter. However, I get repeated objects in different pages.
The code where I execute and process the query result is the following:
Future<void> fetchProductsFromSearch() async {
AlgoliaQuery query = _algoliaClient.instance
.index('products')
.setHitsPerPage(documentLimit)
.setPage(_currentSearchPage);
if (_range != null) {
query = query
.setNumericFilter("price:${_range!['min']!} TO ${_range!['max']!}");
}
AlgoliaQuerySnapshot snapshot =
await query.query(_searchQuery).getObjects();
final rawHits = snapshot.toMap()['hits'] as List;
if (rawHits.isEmpty) {
return;
}
final hits = rawHits
.map<ProductModel>((e) => ProductModel.fromJsonSearch(e))
.toList();
//hits.sort((a, b) => a.price.compareTo(b.price));
log.i("_currentSearchPage $_currentSearchPage");
log.i('hits: ${hits.length}');
log.i(hits.map((e) => e.id).toList());
_products.addAll(hits);
_currentSearchPage += 1;
notifyListeners();
}
The widget that calls the function is the following:
Expanded(
child: NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification notification) {
if (notification.metrics.pixels ==
notification.metrics.maxScrollExtent) {
setState(() {
isLoading = true;
});
if (_pageState == PageState.category) {
productsProvider.fetchProducts();
} else {
productsProvider.fetchProductsFromSearch();
}
setState(() {
isLoading = false;
});
}
return false;
},
child: const ProductsGrid(),
),
),
The logs from fetchProductsFromSearch are
│ #0 packages/molify_app/providers/products_provider.dart 29:35 fetchProductsFromSearch
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ 💡 hits: 10
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ #0 packages/molify_app/providers/products_provider.dart 11:9 fetchProductsFromSearch
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ 💡 [
│ 💡 "m5MnPKPyvmisvOl1xU48",
│ 💡 "RGkKIM3zLmZ6Q38Ggg7I",
│ 💡 "OIfKkn9WxlCzD3MGj7vD",
│ 💡 "NcnKUeTy7Mxjj0yWXiMU",
│ 💡 "HCofoaJ8dH5of5AnwXYl",
│ 💡 "EQr4jWPuwYpB9AhjOKX6",
│ 💡 "0Y0zOoWAa401fkHmK6uP",
│ 💡 "zV7Uc4MqPtTZPHuKp6vl",
│ 💡 "utEjPBUMWS4iTgwV29FX",
│ 💡 "tsSL6BVTAbimqofeRxXK"
│ 💡 ]
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ #0 packages/molify_app/providers/products_provider.dart 153:3 fetchProductsFromSearch
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ 💡 _currentSearchPage 4
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ #0 packages/molify_app/providers/products_provider.dart 29:35 fetchProductsFromSearch
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ 💡 hits: 10
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ #0 packages/molify_app/providers/products_provider.dart 11:9 fetchProductsFromSearch
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ 💡 [
│ 💡 "m5MnPKPyvmisvOl1xU48",
│ 💡 "RGkKIM3zLmZ6Q38Ggg7I",
│ 💡 "OIfKkn9WxlCzD3MGj7vD",
│ 💡 "NcnKUeTy7Mxjj0yWXiMU",
│ 💡 "HCofoaJ8dH5of5AnwXYl",
│ 💡 "EQr4jWPuwYpB9AhjOKX6",
│ 💡 "0Y0zOoWAa401fkHmK6uP",
│ 💡 "zV7Uc4MqPtTZPHuKp6vl",
│ 💡 "utEjPBUMWS4iTgwV29FX",
│ 💡 "tsSL6BVTAbimqofeRxXK"
│ 💡 ]
As you can see, page 2 the objects are the same.
On settings, I am ordering by the product price – in case this is relevant.
What could be the issue here?
Thank you,