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

时间:2018-10-02 18:49:59

标签: dart flutter assets

我要做的是将图像加载到材料小部件中以在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还是很陌生,所以我不知道这是否是一个显而易见的问题

谢谢!

4 个答案:

答案 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');
}