флаттер ListView KeepAlive после некоторой прокрутки

Я хочу keepAlive мои виджеты, которые уже отображаются в ListView. Я пробовал использовать addAutomaticKeepAlives:true свойства, которые предоставляет ListView класс.

Вот мой пример кода, который я использовал. Та же проблема в делегате SliverChildBuilderDelegate, предоставленном 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 ,
);

person NIRAV PATEL    schedule 27.09.2018    source источник


Ответы (4)


Чтобы automaticKeepAlive работал, каждый элемент, который необходимо поддерживать в рабочем состоянии, должен отправлять определенное уведомление.

Типичный способ активировать такое уведомление - использовать 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;
}
person Rémi Rousselet    schedule 27.09.2018
comment
Это работает для изображения? Я пробовал, но изображения все еще перерисовываются, когда я прокручиваю. Если медленно прокручивать это время, проблем нет. но при быстрой прокрутке изображения виджет повторно визуализирует. - person NIRAV PATEL; 28.09.2018
comment
Привет, ты можешь хоть чем-нибудь помочь? У меня аналогичная проблема с CustomScrollView и SliverList ... У меня есть WebView, который постоянно перезагружается при прокрутке страницы ... У меня достаточно высокий cacheExtent на моем CustomScrollView. У меня также есть все предварительные условия, такие как: super.build(context); и bool get wantKeepAlive переопределение ... У меня также есть набор AutomaticKeepAliveClientMixin ... Не уверен, что происходит, но WebView определенно не перезагружается во что-то вроде SingleChildScrollView ... И поэтому я ' Я предполагаю, что его уничтожает CustomScrollView / SliverList ... - person Chris; 20.02.2020

Как указано в ответе AutomaticKeepAliveClientMixin и Реми,

Подклассы должны реализовывать wantKeepAlive, а их методы сборки должны вызывать super.build (возвращаемое значение всегда будет возвращать null, и его следует игнорировать).

Поэтому измените метод сборки на:

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;
}
person Siddanth    schedule 08.07.2020
comment
super.build(context); действительно решил мою проблему. Спасибо - person DVegasa; 19.12.2020

Вы также можете попробовать посмотреть свойство cacheExtent в построителе списков. Установка значения для покрытия ваших предметов сохранит их все в живых. Спасибо Реми выше. Я понятия не имел, какие элементы нужны keepAlive, когда использовал его в списке - раньше этого не было в документации по flutter ...

person Jason Scott    schedule 28.09.2018

если вы хотите сохранить список фрагментов (для CustomScrollView), все, что вам нужно сделать, это использовать «SliverChildListDelegate» вместо «SliverChildBuilderDelegate»

Вот мой код:

final List<Product> products;
return CustomScrollView(
  controller: _scrollController,
    slivers: [
      _mySliverAppBar(context, title),
      SliverList(
        delegate: SliverChildListDelegate(
          List.generate(products.length, (index) => _myProductCard(context,products[index]))
        )
        // SliverChildBuilderDelegate(
        //   (context, index) => _myProductCard(context, products[index]),
        //   childCount: products.length,
        // ),
      ),
   ],
);

Как видно из кода, раньше я использовал SliverChildBuilderDelegate.

person Miguel Ángel Gómez Pérez    schedule 07.09.2020