Для моего проекта я использую firestore для получения данных на пользователя. Поэтому я создал следующую структуру в Firestore.
Данные хранятся в: Коллекция: пользователи> Документ: UID (переменная)> Коллекция: напоминания
Чтобы получить данные из Firestore I необходимо передать UID в хранилище. У моего репозитория напоминаний нет этого стандарта данных, поэтому я получаю его через звонок в Firebase.
Позвольте мне показать код, чтобы сделать его более понятным:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:diabetes/src/model/models.dart';
import 'package:diabetes/src/entities/entities.dart';
import 'package:diabetes/src/repositories/repositories.dart';
class FirebaseRemindersRepository implements RemindersRepository {
final reminderCollection = Firestore.instance.collection("users");
@override
Future<void> addNewReminder(Reminder reminder) async {
try {
final user = await FirebaseAuth.instance.currentUser();
final uid = user.uid;
return reminderCollection
.document(uid)
.collection("reminders")
.add(reminder.toEntity().toDocument());
} catch (error) {
print(error);
}
}
@override
Future<void> deleteReminder(Reminder reminder) async {
try {
final user = await FirebaseAuth.instance.currentUser();
final uid = user.uid;
return reminderCollection
.document(uid)
.collection("reminders")
.document(reminder.id)
.delete();
} catch (error) {
print(error);
}
}
@override
Stream<List<Reminder>> reminders() {
return reminderCollection.snapshots().map((snapshot) {
return snapshot.documents
.map((doc) => Reminder.fromEntity(ReminderEntity.fromSnapshot(doc)))
.toList();
});
}
@override
Future<void> updateReminder(Reminder update) async {
try {
final user = await FirebaseAuth.instance.currentUser();
final uid = user.uid;
return reminderCollection
.document(uid)
.collection("reminders")
.document(update.id)
.updateData(update.toEntity().toDocument());
} catch (error) {
print(error);
}
}
}
Как вы можете видеть это заставляет меня повторять эту часть много раз:
final user = await FirebaseAuth.instance.currentUser();
final uid = user.uid;
Кроме того, я не могу сделать то же самое здесь:
Stream<List<Reminder>> reminders() {