最小码:
File _file;
Future<void> _pickImage() async {
final image = await ImagePicker.pickImage(source: ImageSource.camera);
if (image != null) {
final file = File("${(await getApplicationDocumentsDirectory()).path}/image.png");
await file.writeAsBytes(await image.readAsBytes());
setState(() => _file = file); // `_file = image` works though
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(child: Icon(Icons.camera_alt), onPressed: _pickImage),
body: _file == null ? Container() : Image.file(_file),
);
}
Watch video
如您所见,一旦我选择了图像,它就可以了,但是第二次选择时,它就不起作用了,而且我也没有遇到任何错误。谁能帮忙吗?
最佳答案
您需要三件事:
首先,您必须使用ImageProvider
及其evict()
方法:
var image = FileImage(File('someImage.jpg'));
那么您需要使用上面的
Image
的ImageProvider
小部件,并且还需要分配一个唯一的key
以便每次调用build()
方法时“不同”:child: Image(
image: image,
key: UniqueKey(),
),
最后,在覆盖
someImage.jpg
之后,您必须调用evict()
方法:// part of your _pickImage() method
// here someImage.jpg contains updated content
image.evict();
setState(() {});
更新:实际上,您不需要
var image = FileImage(File('someImage.jpg'));
-您可以在Image
小部件内直接将其用作image: FileImage(File('someImage.jpg'))
,并在覆盖图像后调用FileImage(File('someImage.jpg')).evict()
关于flutter - ImagePicker,如何再次设置图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60914284/