#firebase #flutter #dart #firebase-storage #imageurl
# #огневая база #flutter #dart #firebase-хранилище #imageurl
Вопрос:
Как статически отображать изображение, загруженное из хранилища firebase, всегда в приложении flutter, его можно открыть и просмотреть одним щелчком мыши.
Я уже загрузил изображение с камеры и галереи в хранилище firebase. Теперь я хочу загрузить изображение из хранилища firebase и обеспечить, чтобы загруженные изображения легко оставались в приложении, не исчезая.
Я имею в виду, что когда пользователь посещает экран приложения flutter, загруженное изображение или изображения должны отображаться.
Загруженное изображение с помощью хранилища firebase:
final FirebaseStorage _storage =
FirebaseStorage(storageBucket: 'gs://flutter-imageupload-cb66a.appspot.com');
StorageUploadTask _uploadTask;
_startUpload() async {
String imagePath = 'DeviceImages/DeviceImage${DateTime.now()}.png';
final StorageReference storageReference = FirebaseStorage().ref().child(imagePath);
final StorageUploadTask uploadTask = storageReference.putFile(imageFile1);
await uploadTask.onComplete;
_addPathToDatabase(imagePath);
print("Image uploaded");
setState(() {
_uploadTask =
_storage.ref().child(imagePath).putFile(imageFile1);
});
}
используется firebase_storage: ^3.1.6
и firebase_database:
используется image_picker: ^0.6.7 17
для выбора изображения с камеры и галереи.
Комментарии:
1. В Интернете есть много ответов о том, как получить изображение из хранилища firebase. Для хранения изображений я бы рекомендовал использовать пакет CachedNetworkImage. Изображение будет кэшироваться и храниться локально в течение 30 дней. Если вы хотите хранить изображения постоянно, вам придется сохранять изображения непосредственно в каталоге приложения.
Ответ №1:
Чтобы загрузить изображение из хранилища firebase, попробуйте выполнить следующие действия:
final StorageReference storageReference = FirebaseStorage().ref().child(imagePath);
final UploadTask uploadTask = storageReference.putFile(imageFile1);
uploadTask.then((res) {
res.ref.getDownloadURL();
});
UploadTask
расширяет Future
класс, поэтому вы можете использовать then()
, который регистрирует обратный вызов, который будет вызван после того, как future вернет результат. Затем вы сможете получить url
изображение, используя этот метод getDownloadUrl()
.
После того, как у вас есть url
, вы можете использовать CachedNetworkImage
класс и выполнить следующие действия:
CachedNetworkImage(
imageUrl: imgUrl,
);
Сначала вам необходимо загрузить пакет:
https://pub.dev/packages/cached_network_image
Ознакомьтесь с приведенным здесь руководством о том, как отображать изображения из Интернета:
Комментарии:
1. Я пытался использовать ваш код. Теперь я вижу следующие ошибки: метод ‘then’ не определен для типа ‘StorageUploadTask’. Попробуйте исправить имя на имя существующего метода или определить метод с именем «then». Открыть документацию и неопределенное имя ‘imgUrl’.
2. проверьте мое редактирование. Что касается
imgUrl
этой переменной, которую вы должны создать, вам необходимо сохранитьres.ref.getDownloadURL();
внутри этой переменной3. Мой новый код выглядит следующим образом: конечная ссылка storagereferencefirebasestorage().ref().child(ImagePath); конечная загрузка StorageUploadTask uploadTask = storageReference.PutFile(_imageFile1); uploadTask.then((res) { res.ref.getDownloadURL(); }); //Image.file(Файл(виджет.ImagePath) ; setState(() { _uploadTask = _storage.ref().child(ImagePath).PutFile(_imageFile1); }); CachedNetworkImage( ImageUrl: imgUrl,); }
4.проверьте мое редактирование. Что касается
imgUrl
этой переменной, которую вы должны создать, вам необходимо сохранитьres.ref.getDownloadURL();
внутри этой переменной5. хорошо, что насчет «Метод ‘then’ не определен для типа ‘StorageUploadTask'».