从网络加载图像时 Flutter listview 移动
Flutter listview moving when loading images from network
我正在尝试制作一个列表视图,其中包含从网络加载的大量不同尺寸的图像。
当我向下滚动时一切正常,但是当我向上滚动时,第一张图像开始加载并改变列表视图的位置。我想我需要为具有图像高度的图像占位符,但我不知道如何在加载它们之前获取它们的尺寸。或者我需要像 listview 这样的 smth,它不会因为 smth upper loading 而移动。
您可以使用 SizedBox 覆盖图像。
SizedBox(height: 60, child: Image.network(""),)
我写了一个函数在一个循环中获取图像的高度(收藏夹数组包含地图,如果加载,地图包含 url 参数和高度参数)。该函数还通过公式 MediaQuery.of(context).size.width - 80 将图像的高度转换为我实际需要的大小,这是屏幕上图像的宽度。 (屏幕宽度每边减去 40 个内边距)。
这是获取高度函数的代码:
Future<void> getImageHeight(String url, index) async {
Image image = Image.network(url);
image.image
.resolve(const ImageConfiguration())
.addListener(ImageStreamListener((ImageInfo info, bool isSync) {
favorites[index]['height'] = info.image.height *
((MediaQuery.of(context).size.width - 80) / info.image.width);
setState(() {});
}));
}
这是带有占位符(容器)的图像代码:
Container(
color: const Color(0xffE8E6EA),
height: favorites[index]['height'] == null || favorites[index
['height'].isNaN ? 0: favorites[index]['height'],
child: Image.network(
favorites[index]['url'],
width: double.infinity,
),
),
第一次加载时占位符的大小仍然为零,因为获取它们的高度需要时间。但是过了一段时间(通常需要大约一秒或更短时间)setState 将被调用并且图像不会在滚动时滞后。如果您不是一次从数据库加载图像 urls,您将需要重新运行函数以获取新添加图像的高度。
将 minCacheExtend 设置得足够大
(要高于最高图片的高度)
我正在尝试制作一个列表视图,其中包含从网络加载的大量不同尺寸的图像。 当我向下滚动时一切正常,但是当我向上滚动时,第一张图像开始加载并改变列表视图的位置。我想我需要为具有图像高度的图像占位符,但我不知道如何在加载它们之前获取它们的尺寸。或者我需要像 listview 这样的 smth,它不会因为 smth upper loading 而移动。
您可以使用 SizedBox 覆盖图像。
SizedBox(height: 60, child: Image.network(""),)
我写了一个函数在一个循环中获取图像的高度(收藏夹数组包含地图,如果加载,地图包含 url 参数和高度参数)。该函数还通过公式 MediaQuery.of(context).size.width - 80 将图像的高度转换为我实际需要的大小,这是屏幕上图像的宽度。 (屏幕宽度每边减去 40 个内边距)。
这是获取高度函数的代码:
Future<void> getImageHeight(String url, index) async {
Image image = Image.network(url);
image.image
.resolve(const ImageConfiguration())
.addListener(ImageStreamListener((ImageInfo info, bool isSync) {
favorites[index]['height'] = info.image.height *
((MediaQuery.of(context).size.width - 80) / info.image.width);
setState(() {});
}));
}
这是带有占位符(容器)的图像代码:
Container(
color: const Color(0xffE8E6EA),
height: favorites[index]['height'] == null || favorites[index
['height'].isNaN ? 0: favorites[index]['height'],
child: Image.network(
favorites[index]['url'],
width: double.infinity,
),
),
第一次加载时占位符的大小仍然为零,因为获取它们的高度需要时间。但是过了一段时间(通常需要大约一秒或更短时间)setState 将被调用并且图像不会在滚动时滞后。如果您不是一次从数据库加载图像 urls,您将需要重新运行函数以获取新添加图像的高度。
将 minCacheExtend 设置得足够大 (要高于最高图片的高度)