Reputation: 418
I am using Listview inside Consumer, and when ever I scroll down, then it reloads the Consumer provider.
Here is my complete code.
class UnitScreen extends StatefulWidget {
@override
_UnitScreenState createState() => _UnitScreenState();
}
class _UnitScreenState extends State<UnitScreen> {
Future<void> _getUnits(BuildContext context) async {
return Provider.of<UnitProvider>(context, listen: false).getUnits();
}
Widget _buildUnits(List<Unit> units) {
return ListView.builder(
itemCount: units.length,
itemBuilder: (BuildContext ctx, index) => DisplayItem(
title: units[index].name,
id: units[index].id
),
);
}
@override
void initState() {
Future.delayed(Duration.zero, () {
_getUnits(context);
});
super.initState();
}
@override
Widget build(BuildContext context) {
print('inside build');
return Scaffold(
appBar: SearchableAppBar(
title: "Unit"
),
drawer: AppDrawer(),
body: RefreshIndicator(
onRefresh: () => _getUnits(context),
child: Consumer<UnitProvider>(builder: (ctx, snapshot, child) {
print('inside consumer');
switch (snapshot.unitList.status) {
case Status.LOADING:
return Center(child: CircularProgressIndicator());
break;
case Status.COMPLETED:
return _buildUnits(snapshot.unitList.data);
break;
default:
return ErrorWithRetry();
}
}));
}
}
After loading Units, when I scroll down, then it reload Consumer, as you can see, I have called print method inside consumer and I can see inside consumer multiple times in Debug Console.
I am new to flutter, so Is it a default behavior or am I doing something wrong here?
Upvotes: 0
Views: 1618
Reputation: 619
I think is better to do like this (add instance to your class and call method directly from your class):
Widget build(BuildContext context) {
return ChangeNotifierProvider<UnitProvider>(
create: (context) => UnitProvider.instance(),
child: Scaffold(
appBar: SearchableAppBar(
title: "Unit"
),
drawer: AppDrawer(),
body: Consumer<UnitProvider>(builder: (context, snapshot, child) {
return RefreshIndicator(
onRefresh: () => snapshot.getUnits(context),
child:
Upvotes: 1