一些滚动后颤振ListView KeepAlive

问题描述 投票:0回答:5

我想要

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 ,
);
listview flutter flutter-layout flutter-sliver
5个回答
55
投票

为了让

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;
}

28
投票

正如AutomaticKeepAliveClientMixin和Remi的回答所述,

子类必须实现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;
}

10
投票

您也可以尝试查看列表视图构建器上的cacheExtent属性。将其设置为覆盖您的物品的值将使它们全部存活。 感谢上面的雷米。我不知道在列表中使用它时需要 keepAlive 的项目 - 这不在之前的 flutter doco 中......


6
投票

如果你想保持一个条子列表(对于 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


0
投票

cacheExtent
物业为我解决了这个问题。不,
AutomaticKeepAliveClientMixin
对我有用。

GridView.count(
    cacheExtent: double.infinity,
    ...
)

请注意,该解决方案可能不是很有效,因此请根据显示的项目数量保持网格较小。

© www.soinside.com 2019 - 2024. All rights reserved.