【问题标题】:Flutter - Image remains after being deleted?颤振 - 图像被删除后仍然存在?
【发布时间】:2018-11-28 21:01:05
【问题描述】:

我在抖动图像时遇到了一些奇怪的行为。

我正在使用camera 包来捕获这样的图像:

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

非常简单 - 图像是按照我的预期拍摄的。如果您注意到_captured 成员,我正在使用它来驱动显示相机预览或捕获的图像。这是我的小部件树的 sn-p:

...
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 还很陌生,因此非常感谢任何帮助。

【问题讨论】:

  • 据我所知,您需要将 bool _captured 设置为 false。
  • _captured 作为取消流程的一部分设置为 false,但似乎与发布无关。 UI 适当地在相机预览和图像之间来回切换,只是图像不会随着相机的最新结果更新。
  • 我猜你需要分享更多的代码。可能是 _tempImagePath 没有适当更新。你是用 setState 来调用它的吗?
  • 不,我很确定所有这些都是正确的/不相关的,这就是不包括在内的原因。我已经在下面发布了解决方案。

标签: dart flutter


【解决方案1】:

通过 Github 问题搜索后,我得知 Flutter 是 caching 这些图片在幕后。无论从磁盘中删除它们,它们都会保留在内存中。

我将这个添加到我的删除方法中,我的问题就解决了。

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

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

【讨论】:

  • imageCache.clear() 对我不起作用。 PaintingBinding.instance.imageCache.clear() 成功了。
  • 是只清除相机拍摄的缓存图片还是所有缓存的图片? (我也有一些来自 firestore 的缓存图像)。
【解决方案2】:

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

imageCache.clearLiveImages();

【讨论】:

    【解决方案3】:

    尝试添加这两行来清除缓存:

      imageCache!.clearLiveImages();
      imageCache!.clear();
    

    在我的情况下,它不适用于 imageCache.clear(),所以我也必须清除实时图像

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2022-01-14
      • 2022-01-10
      • 2015-03-21
      相关资源
      最近更新 更多