Firebase Firestore и Flutter

Добро пожаловать в это подробное руководство по использованию Firebase Firestore во Flutter. В этом руководстве мы создадим базовое приложение todo во Flutter, которое использует Firebase Firestore в качестве бэкэнда.

Мы рассмотрим настройку приложения Flutter, добавление всех зависимостей Firebase, настройку правил доступа для чтения и записи, запись в Firestore из Flutter, чтение отдельных объектов из Firestore, чтение и отображение списков объектов, прослушивание обновлений в реальном времени, пакетные обновления для повышения производительности, как разбивать списки из Firestore и заключение.

Настройка приложения Flutter

Для начала вам нужно настроить приложение Flutter. Если у вас уже есть приложение Flutter, вы можете пропустить этот шаг.

Чтобы настроить новое приложение Flutter, откройте терминал и выполните следующую команду:

flutter create my_todo_app

Это создаст новый проект Flutter с именем my_todo_app.

Добавление всех зависимостей Firebase

После настройки приложения вам нужно добавить зависимости Firebase. Откройте pubspec.yamlфайл и добавьте следующие строки:

dependencies:
  firebase_core: ^0.4.4+1
  cloud_firestore: ^0.13.6

Затем выполните следующую команду в терминале для установки зависимостей:

flutter pub get

Настройка правил доступа для чтения и записи Firestore

Прежде чем мы сможем начать писать и читать в Firestore и из него, нам нужно настроить правила доступа. Для этого откройте консоль Firebase и выберите свой проект. Затем выберите вкладку Firestore, а затем выберите вкладку Rules.

На вкладке «Правила» обновите правила следующим образом:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Эти правила разрешат доступ на чтение и запись из любой точки мира.

Запись в Firestore из Flutter

Теперь, когда у нас все настроено, мы можем начать писать в Firestore из нашего приложения Flutter. Для этого мы создадим Todoкласс, который будет представлять один элемент todo.

class Todo {
  String title;
  bool isDone;

  Todo(this.title, this.isDone);

  Todo.fromMap(Map<String, dynamic> map)
      : title = map['title'],
        isDone = map['isDone'];

  Map<String, dynamic> toMap() {
    return {
      'title': title,
      'isDone': isDone,
    };
  }
}

Класс Todoимеет два свойства titleи isDoneи два метода fromMapи toMap, которые используются для преобразования объекта в объект и из Mapобъекта.

Теперь мы можем написать функцию, которая добавит новый элемент todo в Firestore.

Future<void> addTodo(Todo todo) async {
  Firestore.instance.collection('todos').add(todo.toMap());
}

Функция addTodoпринимает Todoобъект в качестве аргумента и добавляет его в todosколлекцию в Firestore.

Чтение отдельных объектов из Firestore

Теперь, когда мы можем писать в Firestore, давайте напишем функцию для чтения одной задачи из Firestore.

Future<Todo> getTodo(String id) async {
  DocumentSnapshot snapshot =
      await Firestore.instance.collection('todos').document(id).get();
  return Todo.fromMap(snapshot.data);
}

Функция getTodoпринимает idв качестве аргумента и извлекает todo из todosколлекции. Затем она возвращает Todoобъект, созданный из данных в DocumentSnapshot.

Чтение и отображение списков объектов

Теперь, когда мы можем читать отдельные объекты из Firestore, давайте напишем функцию для чтения списка задач.

Future<List<Todo>> getTodos() async {
  QuerySnapshot snapshot =
      await Firestore.instance.collection('todos').getDocuments();
  return snapshot.documents.map((doc) => Todo.fromMap(doc.data)).toList();
}

Функция getTodosизвлекает QuerySnapshotиз todosколлекции, затем сопоставляет каждый документ в снимке с Todoобъектом и возвращает список Todoобъектов.

Прослушивание обновлений в реальном времени

Теперь, когда мы можем читать списки объектов из Firestore, давайте напишем функцию для прослушивания обновлений в реальном времени.

Stream<List<Todo>> getTodosStream() {
  return Firestore.instance
      .collection('todos')
      .snapshots()
      .map((snapshot) =>
          snapshot.documents.map((doc) => Todo.fromMap(doc.data)).toList());
}

Функция getTodosStreamвозвращает набор Streamобъектов Todo, которые будут выдавать новые значения при каждом todosобновлении коллекции.

Пакетные обновления для повышения производительности

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

Future<void> batchUpdateTodos(List<Todo> todos) async {
  WriteBatch batch = Firestore.instance.batch();
  todos.forEach((todo) {
    DocumentReference ref =
        Firestore.instance.collection('todos').document(todo.id);
    batch.updateData(ref, todo.toMap());
  });
  await batch.commit();
}

Функция batchUpdateTodosберет список Todoобъектов и создает WriteBatchс обновлениями для каждого Todo. Затем она фиксирует пакет и возвращает , Futureкогда пакет завершен.

Как разбить списки на страницы из Firestore

Теперь, когда мы можем пакетно обновлять задачи, давайте напишем функцию для разбиения списков задач из Firestore на страницы.

Future<List<Todo>> paginateTodos(int page) async {
  QuerySnapshot snapshot = await Firestore.instance
      .collection('todos')
      .orderBy('title')
      .limit(10)
      .offset(page * 10)
      .getDocuments();
  return snapshot.documents.map((doc) => Todo.fromMap(doc.data)).toList();
}

Функция paginateTodosпринимает pageчисло в качестве аргумента и извлекает QuerySnapshotиз todosколлекции. Она упорядочивает задачи по названию, ограничивает результаты до 10 и смещает результаты на номер страницы, умноженный на 10. Затем она сопоставляет каждый документ в снимке с Todoобъектом и возвращает список Todoобъектов.

Заключение

В этом руководстве мы рассмотрели, как использовать Firebase Firestore во Flutter. Мы настроили приложение Flutter, добавили все зависимости Firebase, настроили правила доступа для чтения и записи, записывали в Firestore из Flutter, читали отдельные объекты из Firestore, читали и отображали списки объектов, прослушивали обновления в реальном времени, выполняли пакетные обновления для повышения производительности и как разбивать списки из Firestore на страницы. Мы также создали базовое приложение todo во всех примерах кода.