У меня есть приложение для событий (данные хранятся в Firestore), где пользователи могут «лайкнуть» событие.Я надеюсь, что кто-то может дать мне совет о том, нахожусь ли я на правильном пути.
ОПЦИИ
1) Извлекать данные из Firestore каждый раз, когдаСтраница события загружается (чтобы проверить, понравился ли пользователь событию).Проблема заключается в том, что каждый раз при просмотре события выполняется два разных сетевых запроса.
2) Используйте SharedPreferences для хранения копии eventsLiked (затем используйте eventsLiked.contains (event.id) , чтобы проверить, понравился ли пользователь событию).
3) Используйте пакет поставщика.Я предполагаю, что это путь, но я застрял на этом этапе.Я попытался создать класс «Likes», а затем обновить его, когда нажата кнопка «Нравится», но массив likesList возвращает значение NULL, как только я ухожу со страницы «Событие» (код ниже).
FIRESTORE:
События (коллекция)
- Документ
- заголовок (строка)
- extraData (коллекция)
- likesByUsers (список) // в под-коллекции, чтобы сохранить размер документа события небольшим.
Пользователи (коллекция)
- Документ
- uid (строка)
- userName (строка)
- eventsLiked (список)
likes.dart :
class Likes extends ChangeNotifier {
Likes({this.likesList});
List likesList = [];
updateLikes(likes) {
likesList = likes;
notifyListeners();
}
}
likeButton.dart:
Future _like({user, event, likes}) async {
var firestore = Firestore.instance;
var batch = firestore.batch();
DocumentReference docRef =
firestore.collection('events').document(event.id);
DocumentReference userRef =
firestore.collection('users').document(user.uid);
batch.updateData(docRef, {
'likes': likes.likesList.contains(event.id)
? FieldValue.increment(-1)
: FieldValue.increment(1)
});
batch.updateData(userRef, {
'liked': likes.likesList.contains(event.id)
? FieldValue.arrayRemove([event.id])
: FieldValue.arrayUnion([event.id])
});
batch.commit();
await userRef.get().then(
(value) => likes.updateLikes(
value.data['liked'],
),
);
print("LikesList: ${likes.likesList}");
}
}
event.dart
ChangeNotifierProvider(
builder: (_) => Likes(),
child: Scaffold(
...
Если кто-томогу посоветовать, как это сделать (или сообщить мне, если я иду в совершенно неправильном направлении !!), я был бы очень признателен,
Заранее спасибо!