Flutter. File existsSync() 总是返回false。

6

这是我现在面临的问题。 我有一个名为“assets”的文件夹,里面有一张名为“no_icon.png”的图片。 我已经像这样将它添加到了pubspec.yaml中:

flutter:
  assets:
    - assets/teamShields/
    - assets/no_icon.png

当我在一个StatelessWidget内部这样做时

final imageP = File('assets/no_icon.png');

然后在这个 MaterialApp 中:

body: Text(imageP.existsSync().toString()),

我屏幕上总是看到“false”。

此外,如果我输入Image.asset('assets/no_icon.png'),而不是文本,我可以看到图像被渲染。

我不知道这是一个错误还是我做错了什么...


1
资产不是文件。它们是可执行文件中的捆绑包。 - Rémi Rousselet
2
请查看AssetBundle类。 - Kirollos Morkos
我明白了,那我如何检查资产是否存在?还是应该使用文件? - Isaac
1个回答

2

与其使用文件,您应该使用Flutter的资源支持。它被设计用于处理您在pubspec文件中声明的任何资源。

如果从有状态/无状态小部件中使用,代码如下:

Future<ByteData> loadFile(context) async {
  AssetBundle bundle = DefaultAssetBundle.of(context).bundle;
  try {
    return await bundle.load("path/to.file");
  } catch (e) {
    print("Failed to load file because of $e");
    return null;
  }
}

您可以从任何合适的地方调用它,例如initState或使用FutureBuilder。或者您可以使用:

import 'package:flutter/services.dart' show rootBundle;

...

Future<ByteData> loadAsset() async {
  return await rootBundle.load('assets/some.file');
}

然而,看起来您正在尝试加载一个有特殊情况的图像文件。

根据文档

Widget build(BuildContext context) {
  // ...
  return DecoratedBox(
    decoration: BoxDecoration(
      image: DecorationImage(
        image: AssetImage('graphics/background.png'),
        // ...
      ),
      // ...
    ),
  );
  // ...
}

您只需要使用AssetImage =)。


1
是的,但我正在尝试防止我的程序尝试加载不存在的资源。你知道怎么做吗? - Isaac
这不是资产的真正用途...您需要预定义包括在构建中的确切资产,因此您的应用程序永远不应尝试加载不存在的资产(如果这样做了,那是一个错误)。但是,实现这一点的方法与我在回答的第一部分中所描述的完全相同,即在loadFile周围使用try和catch。不过,我认为没有同步的方法可以做到这一点,如果这是您要尝试的。 - rmtmckenzie
不必同步,但是尝试你回答的第一部分时会抛出错误,就好像它忽略了 try catch 部分。我也尝试使用 catchError,但仍然是同样的情况。 - Isaac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接