项目场景:
在最近的业务中,遇到一个需要定时的去更新本地图片,并进行展示更新操作。
问题描述
Flutter中使用Image.File展示图片时候,若图片发生了变化,即使再次进行加载,图片也不能够展示出图片的变化。
原因分析:
Flutter自动使用了缓存。(我这边也接触Flutter没多久,大家可以看看Flutter实战 图片加载原理与缓存)。
解决方案:
Image
内部维护了一个ImageProvider
对象,而ImageProvider
才是真正维护整个图片加载的工作。Image.File
会将Image
设置为FileImage
这个ImageProvider
。
而在FileImage
的代码中,在进行bool operator ==(Object other)
中只判断了文件路径和缩放比例,所以当我们文件路径不变,缩放比例不变时,Flutter会认为我们使用的还是之前加载的图,并不会重新加载:
@immutable
class FileImage extends ImageProvider<FileImage> {
//略...
@override
bool operator ==(Object other) {
if (other.runtimeType != runtimeType)
return false;
return other is FileImage
&& other.file.path == file.path
&& other.scale == scale;
}
//略...
}
所以可以尝试继承实现FileImage
类,重写==
:
/**
* 扩展FileImage
*/
class FileImageExpansion extends FileImage {
///文件大小
late int fileSize;
FileImageExpansion(File file,{double scale = 1.0})
: assert(file != null),
assert(scale != null),
super(file,scale: scale) {
this.fileSize = file.lengthSync();
}
/**
* 除了比较路径和缩放比例以外,还要比较文件大小
*/
@override
bool operator ==(dynamic other) {
if(other.runtimeType != runtimeType) {
return false;
}
final FileImageExpansion typedOther = other;
return file?.path == typedOther.file?.path && scale == typedOther.scale && fileSize == typedOther.fileSize;
}
}
然后,我们就可以使用该类,来重新加载相同路径、缩放比例,但图片内容发生改变的图片。
Image(image:FileImageExpansion(File(fileparh)));
经测试,可以达成该功能。
因为本人刚接触Flutter不久,该解决办法可能并不是很好,如果您有更好的处理办法,欢迎留言讨论。