Flutter-图像在删除后仍然存在吗?

时间:2018-06-19 20:06:49

标签: dart flutter

我在颤动图像周围遇到一些奇怪的行为。

我正在使用camera包来捕获图像,如下所示:

void _takePicture() {
_controller.takePicture(_tempImagePath).then((_) {
  setState(() {
    _captured = true;
    _shutterButtonController.forward();
    _acceptCancelController.forward();
  });
});
}

非常简单-捕获的图像符合我的期望。如果您注意到_captured成员,则表示我正在使用它来驱动摄像机预览或捕获的图像的显示。这是我的小部件树的一个片段:

...
AspectRatio(
        aspectRatio: _controller.value.aspectRatio,
        child: _captured
            ? Image.file(File(_tempImagePath))
            : CameraPreview(_controller)),
...

这也像我预期的那样运行-捕获后显示图像。但是,发现似乎Image.file(...)将始终显示相同的图像。我尝试了多种删除该图像的方法,但我相信它可以正常工作,但是该图像仍然存在。

我正要删除并重新创建initState()内的整个目录,因为屏幕的结构如下:

Future<String> get getTempImageDirectory async {
  final directory = await getApplicationDocumentsDirectory();
  var imageDirectory = Directory(directory.path + '/images/');

  print('The image directory ${imageDirectory.path} exists: ${imageDirectory.existsSync()}');

  if (imageDirectory.existsSync()) {
    imageDirectory.deleteSync(recursive: true);
  }

  imageDirectory.createSync();

  return imageDirectory.path;
}

即使这样,或按名称手动删除图像,原始捕获的图像仍保留在Image.file(...)创建的小部件中。我相当确定删除操作的效果很好-如果您删除它,相机API会抛出一个错误,它无法覆盖以前的图像。

最后,如果我终止了该应用程序并重新启动,则可以重新拍摄照片并看到一张新的图像,但是同样,该图像将一直保留到整个应用程序被终止为止。好像图像以某种方式被缓存了?

我对Flutter和Dart还是陌生的,所以能提供任何帮助。

2 个答案:

答案 0 :(得分:3)

搜索了Github问题之后,我发现Flutter将caching这些图像隐藏在幕后。它们将保留在内存中,而不管从磁盘中删除。

我将其添加到删除方法中,问题解决了。

import 'package:flutter/painting.dart';
...
imageCache.clear();

我也找到了答案here,但是基于Flutter v0.5.1,import语句似乎是错误的。

答案 1 :(得分:0)

就我而言,也需要清除实时图像。如果您的图片在 ListView 中,请将 Image 键设置为 UniqueKey()。

imageCache.clearLiveImages();