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 во всех примерах кода.