android - 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 是我关心的事情,尤其是涉及包含图像的大型数据集。
任何更深层次的解释都值得赞赏。
解决方案
推荐阅读
- vba - 格式化整个文档每章第一段中的前四个单词
- html - div 的右侧太长。我该如何解决?
- python - 在 Pandas 中,如何将过滤后的 DataFrame 中的单元格映射到原始单元格中的相应单元格?
- ios - iMessage Apple 脚本 - 尝试向可以是全名或号码的目标发送消息
- loops - 如果变量之一未定义,如何不循环
- paraview - ParaView:如何修复“PNGWriter 仅支持无符号字符和无符号短输入”?
- gdb - 无法使用 GDB 插入硬件断点
- html - Jquery 更新 div 包含
- node.js - 同时连接到 Firestore 在线和模拟器?
- javascript - 使用一个对象的值作为另一个对象的键