Преобразование документов Firestore в объекты Dart: подробное руководство

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

Метод 1: сопоставление вручную
Один простой подход — вручную сопоставить поля документа Firestore со свойствами объекта Dart. Например, рассмотрим документ Firestore с полями «имя» и «возраст». Вы можете создать класс Dart, представляющий этот объект, и вручную присвоить значения из документа соответствующим свойствам.

class Person {
  String name;
  int age;
  Person({required this.name, required this.age});
}
Person documentToPerson(DocumentSnapshot<Map<String, dynamic>> document) {
  final data = document.data();
  return Person(name: data['name'], age: data['age']);
}

Метод 2: использование библиотек сопоставления объектов
Чтобы упростить процесс сопоставления, вы можете использовать библиотеки сопоставления объектов, такие как «json_serializable» или «freezed». Эти библиотеки генерируют для вас код сопоставления на основе аннотаций или методов генерации кода.

import 'package:json_annotation/json_annotation.dart';
part 'person.g.dart';
@JsonSerializable()
class Person {
  String name;
  int age;
  Person({required this.name, required this.age});
  factory Person.fromJson(Map<String, dynamic> json) =>
      _$PersonFromJson(json);
  Map<String, dynamic> toJson() => _$PersonToJson(this);
}

Чтобы сгенерировать код сопоставления, выполните следующую команду в каталоге вашего проекта:

flutter pub run build_runner build

Метод 3. Использование библиотек десериализации
В качестве альтернативы вы можете использовать библиотеки десериализации, такие как «built_value» или «dart_json_mapper», для преобразования документов Firestore в объекты Dart.

import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
part 'person.g.dart';
abstract class Person implements Built<Person, PersonBuilder> {
  String get name;
  int get age;
  Person._();
  factory Person([void Function(PersonBuilder) updates]) = _$Person;
  static Serializer<Person> get serializer => _$personSerializer;
}

Метод 4. Использование Stream Builders
Если вам нужны обновления из Firestore в режиме реального времени, вы можете использовать Stream Builders для автоматического обновления объектов Dart при каждом изменении документа Firestore.

StreamBuilder<DocumentSnapshot>(
  stream: FirebaseFirestore.instance
      .collection('persons')
      .doc('personId')
      .snapshots(),
  builder: (context, snapshot) {
    if (!snapshot.hasData) {
      return CircularProgressIndicator();
    }
    final person = documentToPerson(snapshot.data!);
    return Text(person.name);
  },
);

В этой статье мы рассмотрели различные методы преобразования документов Firestore в объекты Dart. Предпочитаете ли вы ручное сопоставление, библиотеки сопоставления объектов, библиотеки десериализации или построители потоков, существуют различные подходы, соответствующие вашим потребностям. Преобразовав документы Firestore в объекты Dart, вы можете легко манипулировать полученными данными и работать с ними в своих приложениях Flutter.