#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')
);
})````