扑。文件existSync()始终返回false

时间:2018-10-04 18:12:24

标签: file dart flutter assets dart-io

这是我现在面临的问题。 我有一个名为“ 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()),

我总是在屏幕上看到错误。

此外,如果我键入Image.asset('assets/no_icon.png'),而不是“文字”,我可以看到渲染的图像。

我不知道这是错误还是我做错了...

1 个答案:

答案 0 :(得分:1)

您应该使用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');
}

但是,似乎您正在尝试加载有特殊情况的图像文件。

来自the docs

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

您需要做的就是使用AssetImage =)。