扑。在加载文件之前检查文件是否存在

Isa*_*aac 34 assets dart flutter

我想要做的是在 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...);
 }
}
Run Code Online (Sandbox Code Playgroud)

因此,由于我使用的是无状态小部件,因此我必须事先知道图像是否存在,否则我将加载一个空值,对吗?

我对 Futter 很陌生,所以我不知道这是否是一个明显的问题

谢谢!

Nae*_*Nae 58

要查看应用程序的内部本地存储中是否存在文件,请使用:

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

  • File(path).exists() 返回一个未来的布尔值。要在无状态小部件中实现此功能,或者仅使用 if 语句进行检查,请使用返回 bool 数据类型的 File(path).existsSync() 。 (3认同)
  • 如何检查给定路径是设备中的文件路径还是服务器的网络路径? (2认同)
  • @JayMungara您可以使用 [Validators](https://pub.dev/packages/validators) 插件中的 **isURL('path')** 方法来区分黑白本地链接和网络链接。 (2认同)
  • @Nae 请不要推荐缓慢的异步 API。Dart 本身不鼓励这样做,请参阅 Linter 规则“avoid_slow_async_io”-> https://dart-lang.github.io/linter/lints/avoid_slow_async_io.html (2认同)

Giu*_*oso 16

对我来说只是这样工作:

import 'dart:io';
File("path/to/file").exists() 
Run Code Online (Sandbox Code Playgroud)

或者,用于同步检查

import 'dart:io';
File("path/to/file").existsSync()
Run Code Online (Sandbox Code Playgroud)

  • `await File("path/to/file").exists()` 与 `File("path/to/file").existsSync()` 相同,对吧?为什么他们都存在? (2认同)
  • @Joran我认为它们存在是因为你可能处于一个没有用 async 关键字标记的闭包中,但你想等待结果。我认为这是故意的。 (2认同)

Ric*_*eap 12

看起来您想尝试ImageProvider从图像可能存在或可能不存在的文件夹中加载一个,然后,如果不存在,则加载后备资产图像(您可以肯定会存在,因为您将它放在根目录中捆)。

尝试这个:

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

  • 好吧,我认为这行不通。`f.existsSync` 总是错误的,因为资产不是文件。根据我问的这个新问题的评论,它们是可执行文件中的捆绑包 /sf/ask/3685712271/ (2认同)