Флаттер.Файл existSync () всегда возвращает false - PullRequest
0 голосов
/ 04 октября 2018

это проблема, с которой я сталкиваюсь сейчас.У меня есть папка с именем «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 Ответ

0 голосов
/ 05 октября 2018

Вместо того, чтобы использовать файлы, вы должны использовать поддержку активов 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 =).

...