在Flutter中,我們可以用下面的代碼從文件中加載圖像:
Image.file(File(_fileName));
這個時候,當_fileName這個文件名稱和路徑不變,文件內容變化時,Flutter並不會更新顯示。問題產生的原因是Flutter自動使用了緩存。
那么怎么辦呢?
我查看到,Image.file 實際上會將 image 設置為 FileImage 這個 ImageProvider。FileImage 的代碼中,在進行 operator 時,只判斷了文件路徑和縮放比例。正是因為如此,我們文件路徑不變,縮放比例不變時,Flutter會認為我們還是用的原圖,並不會重新進行加載。
於是,我想到了辦法是擴展一個FileImage,將這個 operator 的方式改一下。
class FileImageEx extends FileImage { int fileSize; FileImageEx(File file, { double scale = 1.0 }) : assert(file != null), assert(scale != null), super(file, scale: scale) { fileSize = file.lengthSync(); } @override bool operator ==(dynamic other) { if (other.runtimeType != runtimeType) return false; final FileImageEx typedOther = other; return file?.path == typedOther.file?.path && scale == typedOther.scale && fileSize == typedOther.fileSize; } }
接下來,直接使用下面的代碼來加載圖像:
Image(image: FileImageEx(File(_fileName)));
經測試,問題得到解決。
如果您有更好的方式,歡迎留言。