我要做的是将图像加载到材料小部件中以在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权吗?
我对Futter还是很陌生,所以我不知道这是否是一个显而易见的问题
谢谢!
答案 0 :(得分:5)
对我来说,这很简单:
import 'dart:io';
File("path/to/file").exists()
或者,用于同步检查
import 'dart:io';
File("path/to/file").existsSync()
答案 1 :(得分:1)
为了查看应用程序的内部本地存储中是否存在文件:
import 'dart:io' as io;
// for a file
io.File(await path).exists();
// for a directory
io.Directory(await path).exists();
答案 2 :(得分:0)
使用此插件将帮助您避免产生条件。
https://pub.dartlang.org/packages/cached_network_image
我给你一个插件的例子:
new CachedNetworkImage('assets/logo.png', width: 120.0,
errorWidget: new Image.asset('assets/logo_notfound.png', width: 120.0),
placeholder: new Image.asset('assets/logo_notfound.png', width: 120.0),
),
答案 3 :(得分:0)
好像您想尝试从可能存在或可能不存在该图像的文件夹中加载ImageProvider
,然后如果不存在该图像,则加载一个后备资产图像(您可以肯定会以您将其放入根目录包中。
尝试一下:
ImageProvider getImageProvider(File f) {
return f.existsSync()
? FileImage(f)
: const AssetImage('images/fallback.png');
}