使用ImagePicker从库中保存Flutter图像



我有这个功能可以从图库中保存图像并将其显示为背景:

Future _getImage() async {
// ImagePicker picker = ImagePicker();
PickedFile pickedFile = await picker.getImage(source: ImageSource.gallery);
if (pickedFile == null) return;
File tmpFile = File(pickedFile.path);
tmpFile = await tmpFile.copy(tmpFile.path);
setState(() {
if (pickedFile != null) {
//_image = File(pickedFile.path);
_image = tmpFile;
print('_image: $_image');
} else {
print('No image selected');
}
});

}

但在我调用它之后,它说图像是空的:

文件:"/data/user/0.com.app.flutter/cache/image_picker5156338879856055740.jpg"为空,无法作为图像加载。

我不确定这里发生了什么,因为它在控制台中打印的图像很好,如下所示:

_image:文件:'/data/user/0/com.app.flutter/cache/image_picker5156338879856055740.jpg

所以这意味着它在缓存中,但由于某种原因,它返回为空,不会将图像添加到背景中:

decoration: BoxDecoration(
image: DecorationImage(
image: _image == null
? MemoryImage(kTransparentImage)
: FileImage(_image),
fit: BoxFit.cover,

添加了构建,以防出现错误,但我不认为有。基本上,我只需要图库中的图像保持持久并留在应用程序中。

EDIT:在代码中添加了setState((,但它仍然不是持久的,我一定缺少一些东西:

Future _getImage() async {
// ImagePicker picker = ImagePicker();
PickedFile pickedFile = await picker.getImage(source: ImageSource.gallery);
if (pickedFile == null) {
return null;
}
Directory appDirectory = await getApplicationDocumentsDirectory();
File newImage = File(appDirectory.path + 'fileName');
newImage.writeAsBytes(File(pickedFile.path).readAsBytesSync());
setState(() {
_image = newImage;
print(newImage.path + ' test');
});

}

试试这个

Future _getImage() async {
ImagePicker picker = ImagePicker();
final pickedFile = await picker.getImage(source: ImageSource.gallery);
if (pickedFile == null) {
return null;
}
Directory appDirectory = await getApplicationDocumentsDirectory();
File newImage = File(appDirectory.path + 'fileName');
await newImage.writeAsBytes(File(pickedFile.path).readAsBytesSync());
setState(() {
_image = newImage;
});
}

Nevermind,我设法通过SharedPreferences使其持久化,我只制作了两个不同的函数,每个函数用于保存或加载图像,并将_loadImage((添加到initState

void _saveImage(path) async {
SharedPreferences saveImage = await SharedPreferences.getInstance();
saveImage.setString('imagepath', path);
print('Image Saved!');

void _loadImage() async {
SharedPreferences saveImage = await SharedPreferences.getInstance();
setState(() {
_imagepath = saveImage.getString('imagepath');
});

}

最新更新