首页 > 解决方案 > StatefulWidget 作为列表项在 ListView.builder 中的每个滚动上重新创建

问题描述

class ListItem extends StatefulWidget {
  final Product product;

  ListItem(this.bloc, this.product);

  @override
  _ListItemState createState() => _ListItemState(product);
}

class _ListItemState extends State<ListItem> {
  Product product;
  _ListItemState(this.product);

  @override
  Widget build(BuildContext context) {
    return ListTile(
      title: Text(product.title),
      trailing: LikeIcon(
        id: product.id,
        isFavourite: product.isFavorite,
        likeStatusHandler: toggleLikeStatus,
      ),
    );
  }
}

class LikeIcon extends StatefulWidget {
  final int id;
  final bool isFavourite;
  final Function(int) likeStatusHandler;

  LikeIcon({
    @required this.id,
    @required this.isFavourite,
    @required this.likeStatusHandler,
  });

  @override
  _LikeIconState createState() => _LikeIconState(isFavourite);
}

class _LikeIconState extends State<LikeIcon> {
  bool isFavourite;

  _LikeIconState(isFavourite) {
    this.isFavourite = isFavourite;
  }

  @override
  Widget build(BuildContext context) {
    return _favouriteWidget();
  }
}

最初,我将 ListItem 小部件设置为 StatelessWidget,并将 LikeIcon 小部件设置为 StatefulWidget,它控制着 Like 图标的启用/禁用状态。我遇到的问题是,当我滚动列表时,类似的状态丢失了。

后来我将 ListItem 本身作为 StatefulWidget 并解决了这个问题。但是看到日志,我注意到每次滚动时都会重建 ListItem(正在调用 build 方法)。

如果 ListItem 是 StatelessWidget,则在滚动时不会调用 build 方法。在每个滚动条上重建整个 ListItem 是我关心的事情,尤其是涉及包含图像的大型数据集。

任何更深层次的解释都值得赞赏。

标签: androidlistviewflutterstatefulwidget

解决方案


推荐阅读