Приложение Flutter, ListView.builder выдает ошибки при первом запуске. Требуется перезапустить приложение (ListView.builder и image_picker)

#android #flutter #listview

#Android #flutter #listview

Вопрос:

Я обнаружил Flutter и столкнулся с проблемой во время разработки моего приложения.

Я добавляю в свою базу данных разные элементы вместе с данными и ссылкой на фотографию, сделанную с помощью image_picker. Я отображаю список этих разных элементов в главном окне приложения с помощью ListView.builder.

Когда приложение открывается в первый раз, возникает ошибка, не позволяющая найти изображения. Я должен перезапустить приложение, чтобы избежать ошибки.

Должно быть, я что-то упускаю, кто-нибудь может мне помочь?

Это функция, которая обрабатывает захват изображения и сохраняет его.

 Future getImage() async {
  final PickedFile pickedFile = await picker.getImage(source: ImageSource.camera);
  final Directory directory = await getExternalStorageDirectory();
  final String path = directory.path;
  final String filename = basename(pickedFile.path);
  final File newFile = await moveFile(File(pickedFile.path), '$path/$filename');
  setState(() {
    _image = newFile;
  });
}
 

Здесь для отображения списка.

 ListView.builder(
  itemCount: widget.markers.length,
  itemBuilder: (BuildContext context, int index) {
    return ListTile(
      leading: CircleAvatar(
      backgroundImage: AssetImage(widget.markers[index].image),
    ),
    title: Text('title')
  );
})
 

И при первом запуске возникает ошибка :

 **
════════ Exception caught by image resource service ════════════════════════════
The following assertion was thrown resolving an image codec:
Unable to load asset: /storage/emulated/0/Android/data/com.example.flutter_locate_reminder/files/89d7c94f-072a-4308-88d7-2d24b8ca744f9044594904088454133.jpg

When the exception was thrown, this was the stack
#0      PlatformAssetBundle.load
package:flutter/…/services/asset_bundle.dart:225
<asynchronous suspension>
#1      AssetBundleImageProvider._loadAsync
package:flutter/…/painting/image_provider.dart:668
#2      AssetBundleImageProvider.load
package:flutter/…/painting/image_provider.dart:651
#3      ImageProvider.resolveStreamForKey.<anonymous closure>
package:flutter/…/painting/image_provider.dart:504
...
Image provider: AssetImage(bundle: null, name: "/storage/emulated/0/Android/data/com.example.flutter_locate_reminder/files/89d7c94f-072a-4308-88d7-2d24b8ca744f9044594904088454133.jpg")
Image key: AssetBundleImageKey(bundle: PlatformAssetBundle#1fb35(), name: "/storage/emulated/0/Android/data/com.example.flutter_locate_reminder/files/89d7c94f-072a-4308-88d7-2d24b8ca744f9044594904088454133.jpg", scale: 1.0)
════════════════════════════════════════════════════════════════════════════════
 

похоже, он не находит изображения сразу.

Спасибо за помощь 😉

Ответ №1:

чтобы получить изображение

 final image = await picker.getImage(source: ImageSource.camera);
setState(() {
  _image = File(image.path);
});
 

для отображения изображения

 backgroundImage: Image.file(_image),
 

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

Комментарии:

1. Спасибо за вашу помощь! Но я не могу назначить фоновое изображение: Image.file(_image) То же самое с image.file(File(_image)); фоновому изображению нужен ImageProvider, а не файл. Итак, я могу решить свою проблему с помощью: BackgroundImage: FileImage(File(_image)) Спасибо, братан, за правильный путь 😉

Ответ №2:

Используйте Image.file(File file) вместо AssetImage.

   itemCount: widget.markers.length,
  itemBuilder: (BuildContext context, int index) {
    return ListTile(
      leading: CircleAvatar(
      backgroundImage: Image.file(widget.markers[index].image),
    ),
    title: Text('title')
  );
})````