flutter - ImagePicker,如何重新设置图像?
问题描述
最小代码:
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),
);
}
如您所见,一旦我选择了图像,它就可以工作,但是在第二次选择它时,它就不起作用了,我也没有遇到任何错误。有人可以帮忙吗?
解决方案
你需要三样东西:
首先你必须使用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()
在你的图像被覆盖后调用
推荐阅读
- amazon-web-services - Amazon Route 53 将多个子域重定向到其他没有 S3 的子域
- ansible - 在 Ansible 中连接嵌套列表的元素
- java - 什么时候为同步方法分配参数?
- vue.js - 如何在 Nuxt.js 中执行 SignOut 操作
- python - django:电子邮件确认期间的用户激活
- c - 并行数组元素的总和?
- r - ggplot gridded SpatialPolygonsDataFrame 根据点数据生成奇数三角形和子集数据
- graph - 获取许多onenote页面内容
- google-tag-manager - 如何防止 Google 机器人向我的混合面板发送查询?
- wordpress - Avada Builder 自定义帖子类型