首页 > 解决方案 > 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),
  );
}

看视频

如您所见,一旦我选择了图像,它就可以工作,但是在第二次选择它时,它就不起作用了,我也没有遇到任何错误。有人可以帮忙吗?

标签: flutterdart

解决方案


你需要三样东西:

首先你必须使用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()在你的图像被覆盖后调用


推荐阅读