Флаттер, как сначала загрузить локальное изображение, затем сохранить изображение в Firestore и загрузить егоIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Флаттер, как сначала загрузить локальное изображение, затем сохранить изображение в Firestore и загрузить его

Сообщение Anonymous »


класс MessageBubble расширяет StatelessWidget { последняя строка? текст; последняя строка? URL изображения; окончательная строка senderId; конечная позиция BubblePosition; окончательный тип строки; конечная временная метка DateTime; окончательный тип bool isUploading; СообщениеBubble({ этот текст, this.imageUrl, требуется this.senderId, this.position = BubblePosition.middle, требуется этот.тип, требуется this.timestamp, this.isUploading = ложь, }); @переопределить Сборка виджета (контекст BuildContext) { вернуть заполнение( отступ: EdgeInsets.all(10.0), ребенок: Столбец( crossAxisAlignment: senderId == FirebaseAuth.instance.currentUser!.uid ? CrossAxisAlignment.end : CrossAxisAlignment.start, дети: [ Материал( borderRadius: BorderRadius.only( topLeft: позиция == BubblePosition.start || позиция == BubblePosition.middle ? Радиус.круг(30.0) : Радиус.круг(0.0), днослефт: senderId == FirebaseAuth.instance.currentUser!.uid ? Радиус.круг(30.0) : позиция == BubblePosition.end ? Радиус.круг(0.0) : Радиус.круг(30.0), BottomRight: senderId == FirebaseAuth.instance.currentUser!.uid ? позиция == BubblePosition.end ? Радиус.круг(0.0) : Радиус.круг(30.0) : Радиус.круг(30.0), topRight: Radius.circular(30.0), ), высота: 5,0, цвет: senderId == FirebaseAuth.instance.currentUser!.uid ? Colors.blueAccent : Цвета.белый, ребенок: Заполнение( отступ: тип == 'текст' ? EdgeInsets.symmetric (по вертикали: 10,0, по горизонтали: 20,0) : EdgeInsets.ноль, дочерний элемент: тип == 'текст' ? Текст( текст?? '', стиль: TextStyle( цвет: senderId == FirebaseAuth.instance.currentUser!.uid ? Цвета.белый : Цвета.черный54, Размер шрифта: 15,0, ), ) : тип == 'изображение' ? FutureBuilder( будущее: getImagePath(imageUrl!), строитель: (контекст, снимок) { если (snapshot.connectionState == ConnectionState.done) { if (snapshot.hasData && snapshot.data != null) { вернуть контейнер( ограничения: BoxConstraints( максимальная ширина: 300,0, МаксХайт: 250,0, минВысота: 240,0, минШирина: 280,0, ), дочерний элемент: ClipRRect( borderRadius: BorderRadius.circular(30.0), дочерний элемент: Изображение.файл( Файл(снимок.данные!), подходит: BoxFit.чехол, ), ), ); } еще { return Text("Ошибка загрузки изображения."); } } еще { вернуть CircularProgressIndicator(); } }, ) : нулевой, ), ), ], ), ); } } Future PickAndUploadImages() async { List ThumbnailURLs = []; List imageURLs = []; Список? mediaList = ждут ImagesPicker.pick( счет: 5, PickType: PickType.image, язык: Язык.Система, ); если (mediaList != ноль && mediaList.isNotEmpty) { for (Медиа-медиа в mediaList) { Файл imageFile = Файл(media.path); Файл? compressedThumbFile = ждут compressImage(File(media.thumbPath ?? "default_path")); если (compressedThumbFile == null) продолжить; Строка fileExtension = getFileExtension(imageFile); пытаться { // Загрузка миниатюры TaskSnapshot ThumbSnapshot = ожидание FirebaseStorage.instance .ref('chatMedia/$chatId/миниатюра') .child(DateTime.now().milli SecondsSinceEpoch.toString() + '.jpg') .putFile(сжатыйThumbFile); Строка ThumbURL = ожидание ThumbSnapshot.ref.getDownloadURL(); TaskSnapshot imageSnapshot = ждут FirebaseStorage.instance .ref('chatMedia/$chatId/изображение') .child(DateTime.now().milli SecondsSinceEpoch.toString() + '.' + fileExtension) .putFile(файл изображения); Строка imageURL = ожидание imageSnapshot.ref.getDownloadURL(); ThumbnailURLs.add(thumbURL); imageURLs.add(imageURL); } поймать (ошибка) { print('Ошибка при загрузке изображения: $error'); } } await _firestore.collection('private_chat').doc(chatId).collection('messages').add({ 'thumbnailURLs': URL-адреса миниатюр, 'imageURL': URL-адреса изображений, «тип»: «изображение», 'senderId': текущийUid, 'метка времени': Timestamp.now(), }); } } Оба кода существуют в разных файлах dart. Это приложение для чата. Цель функции, которую я хочу, — сначала загрузить локальное изображение в messagebubble, когда пользователь загружает изображение, загрузить его в Firestore на серверной стороне, а затем позже загрузить изображение из Firestore.

Другими словами, как способ улучшения UX, загрузка в БД и последующая ее перезагрузка занимает определенное время, что неудобно для пользователей, поэтому мы пытаемся это улучшить.

Я искал и решал различные способы загрузки локальных изображений, но возникали различные ошибки, такие как полное нераспознавание локального изображения, загрузка двух изображений Firestore и т. д.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»