Flutter: сохранение пользовательских данных (Firestore) с использованием провайдера - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть приложение для событий (данные хранятся в 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(
  ...

Если кто-томогу посоветовать, как это сделать (или сообщить мне, если я иду в совершенно неправильном направлении !!), я был бы очень признателен,

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...