StatefulWidget как элемент списка воссоздается при каждой прокрутке в ListView.builder - PullRequest
0 голосов
/ 02 мая 2020
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 перестраивается (вызывается метод сборки) при каждой прокрутке.

Если ListItem является StatelessWidget, то метод построения не вызывается при прокрутке. Меня беспокоит перестройка всего ListItem на каждом свитке, особенно это касается больших наборов данных с изображениями.

Любое объяснение на более глубоком уровне приветствуется.

...