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.