Флаттер базы данных Firebase - PullRequest
0 голосов
/ 14 января 2020

Я делаю заявление с помощью флаттера, в котором мне нужно получать данные из каждой отдельной коллекции из флаттера базы данных Firebase. Решение, если у вас есть один

postref.document(post.authorId)
    .collection ('users'). documents ('Posts')
    .COLLECTION ('$DateTime').add({

1 Ответ

0 голосов
/ 14 января 2020

ДЛЯ ПОЛУЧЕНИЯ ДАННЫХ ИЗ 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});
     }

Вы также можете использовать данные обновления в соответствии с вашими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...