Flutter lazy image
·2 min read
说个漫画类 APP 加载
flutter listview 因为要释放屏幕外的图片,
那么会状态刷新时,前面的图片高度会变成 0
使得滚动乱跳。那么可以用 Sizedbox 将图片框起来
当图片加载后,计算图片的高度,将这个高度赋值给 sizedbox
这样 List 里的 每个元素高度就被固定了,滚动起来不会乱跳
用 customscroll 应该更合适些,因为每个元素的高度不一致
代码
ListView.builder(
itemCount: controller.chapterImagesRx.length,
padding: EdgeInsets.all(0),
controller: controller.scrollController,
itemBuilder: (c, o){
String imageUrl = controller.chapterImagesRx[o];
imageUrl = imageUrl.startsWith("//") ? "https:$imageUrl" : imageUrl;
// image
final Image image = Image.network(
imageUrl,
fit: BoxFit.contain
);
// stream
final ImageStream stream = image.image.resolve(ImageConfiguration.empty);
// listener
stream.addListener(
// 加载完图片,拿到图片的高度,赋值给图片的容器
ImageStreamListener((ImageInfo info, bool _) {
final uii.Image image = info.image;
final imageWidth = image.width.toDouble();
final imageHeight = image.height.toDouble();
// 注意在这里设置高度
controller.chapterImagesHeightRx[o] = ui.windowWidth * (imageHeight/imageWidth);
}),
);
// 图片的容器
return SizedBox(
// 在这里使用高度
height: controller.chapterImagesHeightRx[o],
child: image,
);
}
);