【问题标题】:Check if a file exists before loading it在加载文件之前检查文件是否存在
【发布时间】:2019-03-07 22:48:39
【问题描述】:

我想要做的是在 Material Widget 中加载图像以在 ListTile 中使用它,但该资源可能不存在。

class MyImage extends StatelessWidget {
  final imagePath;

  MyIcon(String iconName) {
    try { // check if imagePath exists. Here is the problem
      imagePath = check('assets/$iconName.png/');
    } catch (e, s) { // if not
      imagePath = 'assets/$iconName.png/';
    }
  }

 @override
  Widget build(BuildContext context) {
    return Material(...here I will load the imagePath...);
 }
}

所以,由于我使用的是无状态小部件,所以我必须事先知道图像是否存在,否则我会加载 null 对吗?

【问题讨论】:

    标签: dart flutter assets


    【解决方案1】:

    为了查看文件是否存在于应用程序的内部本地存储中:

    import 'dart:io' as io;
    var syncPath = await path;
    // for a file
    io.File(syncPath).exists();
    // for a directory
    io.Directory(syncPath).exists();
    

    【讨论】:

    • 如何检查给定的路径是设备中的文件路径还是来自服务器的网络路径?
    • @JayMungara 您可以使用 Validators 插件中的 isURL('path') 方法来区分黑白本地和网络链接。
    • File(path).exists() 返回一个未来的布尔值。要在无状态小部件中实现这一点,或者仅使用 if 语句检查,请使用返回 bool 数据类型的 File(path).existsSync()。
    • @JayMungara - 你找到答案了吗?
    • @CodeGeek 你的解决方案不适用于这个问题。
    【解决方案2】:

    对我来说只是这样工作:

    import 'dart:io';
    File("path/to/file").exists() 
    

    或者,用于同步检查

    import 'dart:io';
    File("path/to/file").existsSync()
    

    【讨论】:

    • await File("path/to/file").exists() 与File("path/to/file").existsSync() 相同,对吗?为什么它们都存在?
    • @Joran 我认为它们存在是因为您可能处于未用 async 关键字标记的闭包中,但您想等待结果。我认为这是故意的。
    【解决方案3】:

    看起来您想尝试从图像可能存在或可能不存在的文件夹中加载ImageProvider,然后,如果不存在,则加载备用资产图像(您可以确定它会像您一样存在)会把它放在你的根包中)。

    试试这个:

    ImageProvider getImageProvider(File f) {
      return f.existsSync()
          ? FileImage(f)
          : const AssetImage('images/fallback.png');
    }
    

    【讨论】:

    • 谢谢!这就是我一直在寻找的,但由于某种原因,f.existsSync() 总是返回 false。
    • 好的,我认为这行不通。 f.existsSync 总是错误的,因为资产不是文件。根据我提出的这个新问题的评论stackoverflow.com/questions/52653032/…,它们是可执行文件中的捆绑包
    • 正如我之前所说,您不需要测试资产是否存在——您在构建时就知道这一点。但是在评论中你说“我以前会下载(半自动)”,所以这些你将写入一个读/写文件夹并可以测试它们是否存在。
    • 我不明白。这些文件被写入 assets 文件夹,在 pubspec 中提到 assets 文件夹,然后编译应用程序。然后我需要在用户想要查看该团队的一些信息时进行测试,如果它的图标存在,因为它不确定每个团队都有它的图标。
    • 所以,您真正想知道的是资产是否存在。最好的方法是包含一个附加的(文本?json?)资产,它是所有其他资产的列表。事实上,flutter 为你创建了一个。它被称为AssetManifest.json。这是一个实现细节,因此可能会发生变化,但目前似乎可行。
    【解决方案4】:

    为了查看本地存储中是否存在文件(与 image.network 一样),现在您可以使用:

    Image.file(File("path/to/file"),
    errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {return Text('file access error');
    

    【讨论】:

    • 这不能回答操作员的问题。
    猜你喜欢
    • 2018-06-21
    • 2013-12-21
    • 1970-01-01
    • 2018-02-20
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多