'Flutter unable to apply lazyLoad
I'm new in flutter trying to apply lazyLoad in my products page. Here I'm using provide package.
My API data looks like
{
"products": [
{
"id": 1,
"title": "Amazon Gift Card",
}
]
}
My API's URL looks like
products?page=1
products?page=2
-------
-------
My Provider looks like
class ProductsProvider with ChangeNotifier {
List<Product> _products = [];
//flutter getter
List<Product> get products {
return [..._products];
}
Future<void> fetchAndSetProductsByCatId({required int catId, int page = 1}) async {
String url = Constants.apiUrl + '/products/cat/$catId.json?page=$page';
var urlParse = Uri.parse(url);
try {
final response = await http.get(urlParse);
final Map<String, dynamic> extractedData = json.decode(response.body);
final List<dynamic> products = extractedData["products"];
final List<Product> loadedProducts = [];
for (var productData in products) {
loadedProducts.add(Product(
id: productData['id'],
title: productData['title'],
)
);
}
_products = loadedProducts;
notifyListeners();
} catch (error) {
rethrow;
}
}
}
Now I'm trying to create a list with lazyload data
class _CategoryProductsPageState extends State<CategoryProductsPage> {
List categoryProducts = [];
var _isLoading = true;
int _page = 1;
late int listLength;
final ScrollController _scroolController = ScrollController();
@override
void initState() {
Provider.of<ProductsProvider>(context, listen: false)
.fetchAndSetProductsByCatId(catId: widget.catId['id'], page: _page);
_scroolController.addListener(() {
if (_scroolController.position.pixels ==
_scroolController.position.maxScrollExtent) {
if (listLength != 0) {
setState(() {
_page++;
});
Provider.of<ProductsProvider>(context, listen: false)
.fetchAndSetProductsByCatId(
catId: widget.catId['id'], page: _page
);
}
// print(_page);
}
});
super.initState();
}
@override
void dispose() {
_scroolController.dispose();
super.dispose();
}
@override
void didChangeDependencies() {
WidgetsBinding.instance!.addPostFrameCallback((_) => {_isLoading = false});
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
final productsData = Provider.of<ProductsProvider>(context);
setState(() {
listLength = categoryProducts.length;
categoryProducts.add(productsData.products);
});
return Scaffold(
body : ListView.separated(
controller: _scroolController,
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
itemCount: categoryProducts.length,
itemBuilder: (ctx, i) => ProductListRow(
id: categoryProducts[i].id,
title: categoryProducts[i].title,
),
separatorBuilder: (BuildContext context, int index) => const Divider(),
),
)
}
Using print I have checked my URL is changing wite page 1,2,3.... But I'm unable to append list in state. I have created a categoryProducts list then tried to append in builder state.I'm getting below error
The following NoSuchMethodError was thrown building:
Class 'List<Product>' has no instance getter 'id'.
Receiver: Instance(length:5) of '_GrowableList'
Tried calling: id
How can I fix this issue ?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
