ДЛЯ ПОЛУЧЕНИЯ ДАННЫХ ИЗ FIREBASE:
Создайте отдельный файл и назовите его, возможно, firebase_references.dart. В этом файле запишите эту ссылку в вашу базу данных:
import 'package:cloud_firestore/cloud_firestore.dart';
final databaseReference = Firestore.instance;
Теперь вы можете использовать эту ссылку в любом месте, чтобы извлекать данные и манипулировать ими / использовать их так, как вы хотите, следующим образом:
Предположим, что Вы хотите получить данные в файле с именем first_page.dart
, в этом файле введите следующий код:
СДЕЛАЙТЕ ЭТУ ФУНКЦИЮ ВНЕ СТРОИТЕЛЬНОЙ ФУНКЦИИ ЛЮБОГО ВИДЖЕТА:
Не забудьте импортировать firebase_references.dart здесь ...
getData() async {
DocumentSnapshot snapshot = await databaseReference
.collection("NAME_OF_COLLECTION")
.document("NAME_OF_DOCUMENT")
.get();
print(snapshot.data); //snapshot.data is what you want, use this however you want.
}
ОБНОВЛЕНИЕ ДАННЫХ В FIREBASE:
Как вы упомянули, вы хотите позволить пользователю загружать несколько фотографий в базу данных, позволяя пользователю загружать файлы напрямую Для Firestore не очень хорошая практика, во-первых, Firestore позволяет загружать файлы в базу данных, но есть некоторые ограничения. Например, Вы не можете опубликовать фотографию более чем 2mbs к нему. Решением является загрузка изображений / файлов в хранилище Firebase, получение URL-адреса оттуда и размещение URL-адресов в базе данных. Это выглядит следующим образом:
Так же, как я писал о создании отдельного файла для ссылки на базу данных, я бы предложил создать другой файл для ссылки на хранилище. Это должно выглядеть следующим образом:
import 'package:firebase_storage/firebase_storage.dart';
final StorageReference storageReference = FirebaseStorage.instance.ref();
Теперь перейдем к основной части, чтобы позволить пользователю выбрать фотографию и сжать ее, чтобы мы могли опубликовать ее в хранилище Firebase и получить URL, который позже мы можем опубликовать в базу данных.
В first_page.dart
запишите эти функции (я дам краткое представление о том, как они выглядят пошагово, а из c они должны быть вне вашей функции сборки) :
Шаг 1: Определите переменную, например File imgToUpload;
Шаг 2: Пусть пользователь сделает фотографию:
//This illustrates how to take a photo input using image_picker, you can do the same for the gallery too.
handleTakePhoto() async {
Navigator.pop(context);
File file = await ImagePicker.pickImage(
source: ImageSource.camera,
maxHeight: 500,
maxWidth: 500,
);
setState(() {
this.imgToUpload = file;
});
}
Шаг 3: Сжать изображение. Для этого вам потребуется импорт следующим образом:
import 'package:image/image.dart' as Img;
import 'package:path_provider/path_provider.dart';
compressImage() async {
final tempDir = await getTemporaryDirectory();
final path = tempDir.path;
Img.Image imageFile = Img.decodeImage(imgToUpload.readAsBytesSync());
final compressedImageFile = File('$path/img_name.jpg')
..writeAsBytesSync(Img.encodeJpg(imageFile, quality: 85));
setState(() {
imgToUpload = compressedImageFile;
});
}
Шаг 4: Загрузить изображение и получить URL:
Future<String> uploadImage(imageFile) async {
StorageUploadTask uploadTask =
storageReference.child("post_name.jpg").putFile(imageFile);
StorageTaskSnapshot storageSnap = await uploadTask.onComplete;
String downloadUrl = await storageSnap.ref.getDownloadURL();
return downloadUrl; //this is what you need.
}
Шаг 5: Отправить сообщение, окончательное:
submitPost() async {
await compressImage();
String mediaUrl = await uploadImage(imgToUpload);
databaseReference.collection("COLLECTION_NAME").document("DOCUMENT_NAME).
setData({"postedPhotoUrl" : mediaUrl});
}
Вы также можете использовать данные обновления в соответствии с вашими потребностями.