Programmer
Programmer

Reputation: 418

Listview Builder causing reload Consumer in Flutter

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

Answers (1)

M.B
M.B

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

Related Questions