Flutter:使用提供程序保存自定义用户数据(Firestore)

时间:2019-09-20 11:47:35

标签: flutter google-cloud-firestore

我有一个事件应用程序(数据存储在Firestore中),用户可以在其中“喜欢”事件。我希望有人可以就我是否走对路提供建议。

选项

  

1)每次加载事件页面时,从Firestore中获取数据(以检查用户是否喜欢事件)。问题是每次查看事件时都会发出两个不同的网络请求。

     

2)使用SharedPreferences存储eventsLiked的副本(然后使用 eventsLiked.contains(event.id)检查用户是否喜欢该事件)。

     

3)使用提供程序包。我猜这是要走的路,但是我现在还停留在那儿。我尝试制作一个“ Likes”类,然后在按下“ like”按钮时对其进行更新,但是当我离开“事件”页面(下面的代码)后,likesList数组将返回null。

存储:

  • 事件(集合)

    • 文档
      • 标题(字符串)
      • 额外数据(集合)
        • likedByUsers(列表) //在子集合中,以保持事件文档的大小较小。
  • 用户(集合)

    • 文档
      • uid(字符串)
      • 用户名(字符串)
      • 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(
  ...

如果有人可以提出建议(或告诉我我是否朝着完全错误的方向前进!),我将不胜感激。

谢谢!

0 个答案:

没有答案