Flutter не может загрузить изображение на физическое устройство (но загружает его в эмуляторе)

Я создаю приложение flutter, и изображение актива не загружается, когда я запускаю приложение на своем телефоне, но оно загружается нормально, когда я запускаю приложение на эмуляторе.

Вот ошибка, которую я получаю:

> I/flutter (26364): ══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE
> ╞════════════════════════════════════════════════════ I/flutter
> (26364): The following assertion was thrown resolving an image codec:
> I/flutter (26364): Unable to load asset: images/diamond.png I/flutter
> (26364): I/flutter (26364): When the exception was thrown, this was
> the stack: I/flutter (26364): #0      PlatformAssetBundle.load
> (package:flutter/src/services/asset_bundle.dart:221:7) I/flutter
> (26364): <asynchronous suspension> I/flutter (26364): #1     
> AssetBundleImageProvider._loadAsync
> (package:flutter/src/painting/image_provider.dart:464:44) I/flutter
> (26364): <asynchronous suspension> I/flutter (26364): #2     
> AssetBundleImageProvider.load
> (package:flutter/src/painting/image_provider.dart:449:14) I/flutter
> (26364): #3      ImageProvider.resolve.<anonymous closure>.<anonymous
> closure>.<anonymous closure>
> (package:flutter/src/painting/image_provider.dart:316:48) I/flutter
> (26364): #4      ImageCache.putIfAbsent
> (package:flutter/src/painting/image_cache.dart:160:22) I/flutter
> (26364): #5      ImageProvider.resolve.<anonymous closure>.<anonymous
> closure> (package:flutter/src/painting/image_provider.dart:316:25)
> I/flutter (26364): (elided 13 frames from package dart:async)
> I/flutter (26364): I/flutter (26364): Image provider:
> AssetImage(bundle: null, name: "images/diamond.png") I/flutter
> (26364): Image key: AssetBundleImageKey(bundle:
> PlatformAssetBundle#5b025(), name: "images/diamond.png", I/flutter
> (26364):   scale: 1.0) I/flutter (26364):
> ════════════════════════════════════════════════════════════════════════════════════════════════════

А вот и мой pubspec.yaml

flutter:
  uses-material-design: true
  assets:
    - images/

Вот main.dart:

import 'package: flutter / material.dart';

void main() {
  runApp(
    MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.blueGrey[900],
          title: Text('Picture Motivation'),
        ),
        body: Center(
          child: Image(
            image: AssetImage('images/diamond.png'),
          ),
        ),
      ),
    ),
  );
}

Что очень сбивает с толку, так это то, почему изображение правильно загружается в эмуляторе, а не на физическом устройстве. Есть подсказка?

Большое спасибо.


person Giulia    schedule 11.10.2019    source источник


Ответы (1)


Делайте это шаг за шагом, и все должно работать нормально. По сути, вы делаете это неправильно.

  1. Поместите изображения в папку с ресурсами, чтобы корневой каталог был assets/diamond.png.
  2. Или, если у вас есть другая папка в папке с ресурсами, images, тогда корнем будет assets/images/diamond.png

pubspec.yaml

flutter:
   uses-material-design: true
   //you have to give the proper path in order to get the image in your UI
   assets: 
     - assets/images/diamond.png

Код пользовательского интерфейса:

//this is how your image calling work, you just have to copy the path, same as pubspec.yaml
Center(
   child: Image(
      image: AssetImage('assets/images/diamond.png'),
   )
)

Я уверен, что вы сможете получить изображение прямо сейчас. Сообщите мне, если это поможет.

person Alok    schedule 11.10.2019
comment
Привет @Alok! Я могу подтвердить, что если я укажу весь путь к изображению в pubspec.yaml, он будет правильно отображаться даже на физическом устройстве! Большое спасибо за подсказку. Кстати, разве он не должен получать все файлы, если вы просто укажете имя папки с активами, как я сделал ранее? Вот что написано в документации ... - person Giulia; 11.10.2019
comment
Ну, если быть точным, устройство обычно не подтверждает получение файлов из вашей папки, вам также необходимо указать имя папки, которое равно assets, это хорошая практика и не приведет вас к путанице, ни к устройство тоже. Здесь, в assets:, он требует, чтобы данные были указаны в пути, вы можете попробовать это сделать, я не уверен, сработает это или нет, assets: images/diamond.png, а остальное оставьте без изменений. - person Alok; 11.10.2019