Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

flutter ListView KeepAlive after some scroll

I want to keepAlive my widgets which are already rendered in ListView. I was tried with addAutomaticKeepAlives:true properties which provide by ListView class.

Here is my sample code which I was used. Same issue in SliverChildBuilderDelegate delegate which provide by SliverList.

ListView.builder(
    itemBuilder: (context,index){
      return Card(
        child: Container(
          child: Image.asset("images/${index+1}.jpg",fit: BoxFit.cover,),
          height: 250.0,
        ),
      );
    },
    addAutomaticKeepAlives: true,
    itemCount:40 ,
);
like image 591
NIRAV PATEL Avatar asked Sep 27 '18 16:09

NIRAV PATEL


2 Answers

For automaticKeepAlive to work, each item that needs to be kept alive must send a specific notification.

A typical way to fire such notification is using AutomaticKeepAliveClientMixin

class Foo extends StatefulWidget {
  @override
  FooState createState() {
    return new FooState();
  }
}

class FooState extends State<Foo> with AutomaticKeepAliveClientMixin {
  @override
  Widget build(BuildContext context) {
    return Container(

    );
  }

  @override
  bool get wantKeepAlive => true;
}
like image 147
Rémi Rousselet Avatar answered Oct 02 '22 18:10

Rémi Rousselet


As stated by AutomaticKeepAliveClientMixin and Remi's answer,

Subclasses must implement wantKeepAlive, and their build methods must call super.build (the return value will always return null, and should be ignored).

Therefore, change your build method to:

class Foo extends StatefulWidget {
  @override
  FooState createState() {
    return new FooState();
  }
}

class FooState extends State<Foo> with AutomaticKeepAliveClientMixin {
  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Container(

    );
  }

  @override
  bool get wantKeepAlive => true;
}
like image 37
Siddanth Avatar answered Oct 02 '22 18:10

Siddanth