Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 从Dart的Firestore获取布尔状态_Flutter_Google Cloud Firestore_Boolean - Fatal编程技术网

Flutter 从Dart的Firestore获取布尔状态

Flutter 从Dart的Firestore获取布尔状态,flutter,google-cloud-firestore,boolean,Flutter,Google Cloud Firestore,Boolean,我试图在初始化应用程序时从Firestore获取bool值:如果是“like”,则返回True;如果不是“like”,则返回False。每次用户喜欢/不喜欢帖子时,Firestore上都会创建或更新一个数据库(称为userFavorites)。userFavorite数据库由以下部分组成:文档(用户ID)、集合(“帖子”)、文档(帖子ID)、集合(isLiked:true或isLiked:false)。因此,在初始化应用程序时,我尝试为UI上显示的每个帖子访问此True/False(如果用户从未

我试图在初始化应用程序时从Firestore获取bool值:如果是“like”,则返回True;如果不是“like”,则返回False。每次用户喜欢/不喜欢帖子时,Firestore上都会创建或更新一个数据库(称为userFavorites)。userFavorite数据库由以下部分组成:文档(用户ID)、集合(“帖子”)、文档(帖子ID)、集合(isLiked:true或isLiked:false)。因此,在初始化应用程序时,我尝试为UI上显示的每个帖子访问此True/False(如果用户从未喜欢或取消链接帖子,则此bool的值将自动为False)

如果您能就我用来从Firestore获取真/假布尔值的代码给我反馈/更正,我将不胜感激,因为即使我没有收到任何错误,我的IU上的布尔值也是空的,我不知道我是在代码的这一部分还是在另一部分出错

以下是我使用的代码:

class HomeFeed extends StatelessWidget {
  final user = FirebaseAuth.instance.currentUser;
  ValueKey valueKey; 

  Future<DocumentSnapshot> getDocumentSnapshotForCurrentUserLikes(String userId, String documentId) async {
    final String userId = user.uid;
    final String documentId = valueKey.value;
    return await FirebaseFirestore.instance.collection('userFavorites').doc(userId).collection('posts').doc(documentId).get();
  }
  bool getCurrentUserLikesValue(DocumentSnapshot documentSnapshotForCurrentUserLikes) {
    return documentSnapshotForCurrentUserLikes.data()['isLiked'];
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: FirebaseFirestore.instance.collection('post').doc('Post in Feed').collection('posts').orderBy('createdAt', descending: true,).snapshots(),
      builder: (ctx, AsyncSnapshot<QuerySnapshot> postSnapshot) {
        if (postSnapshot.connectionState == ConnectionState.waiting) {
          return Center(
            child: CircularProgressIndicator(),
          );
        }
        final postDocs = postSnapshot.data.docs;
        return ListView.builder(
          reverse: false, 
          itemCount: postDocs.length,
          itemBuilder: (ctx, index) {
            ValueKey valueKey = ValueKey(postDocs[index].id);
            return Padding(
              padding: const EdgeInsets.all(8.0),
              child: Container(
                child: PostContainer(
                  user.uid,
                  postDocs[index].data()['likes'],
                  getCurrentUserLikesValue(postDocs[index]) == null ? false : getCurrentUserLikesValue(postDocs[index]), 
                  key: valueKey,
                ),
              ),
            );
          },
        );
      },
    );
  }
}
如果这是您所引用的代码,我如何将其与“set”一起使用,而不是与“get”一起使用(因为如果我使用“get”,则必须事先在Firebase中为每个用户创建用户引用,这将是低效的)?同样对于doc.data['userLikedPosts'],我得到了一个关于['userLikedPosts']的错误,它说“没有为“Map Function()”类型定义运算符“[]”。请尝试定义运算符“[]”。您如何解决这个问题?非常感谢你的帮助


你好!!我已经研究和工作了一段时间,我遇到的问题是,我无法在每次初始化post(或在屏幕上看到)时获取并显示Firestore数据库中的T/F bool值。我可以使用什么代码来实现这一点?我非常感谢你在这里的帮助。谢谢

你让你的生活变得更加艰难:

考虑这样一个db结构:

IconButton(
      icon: Icon(
        isLiked == true ? Icons.favorite : Icons.favorite_border, 
        color: Colors.red,
        size: 25.0,
      ),
      onPressed: () async{
        DocumentReference docRef = FirebaseFirestore.instance.collection('userFavorites').doc(this.widget.userId);
        DocumentSnapshot doc = await docRef.get();
        List userLikedPosts = doc.data['userLikedPosts'];
        if(userLikedPosts.contains(documentId)==true) {
          docRef.update({'userLikedPosts' : FieldValue.arrayRemove([documentId])});
        } else {
          docRef.update({'userLikedPosts' : FieldValue.arrayUnion([documentId])});
        }
userFavorite (collection)
   |---{userId} (document)
       |--- liked_posts (Array) [array of post Ids the posts the user liked]
            |--- ['postA', 'postB', 'post3131',...]
通过这样做,对于每个postID,您只需检查它是否存在于
liked\u posts
数组中。这是一种更干净的做事方式。您不需要额外的文档和集合级别

当用户单击帖子上的“like”时,您可以使用将该帖子添加到该用户的liked_posts字段中

更新:

对不起,我不能帮你处理颤振代码。我只能说:

??用户喜欢这个帖子吗?如果是这样,您可以更新
userLikedPosts
(数组)字段,而无需先读取它。使用ArrayUnion时,如果postId位于该数组中,则不会添加它;如果postId不在该数组中,则会添加它,而不会更改数组中的其他元素

??用户不喜欢这个帖子吗?如果是这样,您可以更新
userLikedPosts
(数组)字段,而无需先读取它。使用ArrayRemove,如果postId在该数组中,它将被删除,如果它不在该数组中,则什么也不会发生,数组中的其他元素也不会更改

在您的位置,我不会使用update():

相反,我将set()与
{merge:true}
一起使用:

docRef.set( {'userLikedPosts' : FieldValue.arrayRemove([documentId])}, {merge:true} );
ArrayUnion/ArrayRemove与set()完美配合,不会重写数组。此外,如果文档不存在,那么它将自动创建


很抱歉,我无法帮助您了解实际的颤振代码,但我的主要观点是,在响应喜欢/不喜欢的用户操作时,您不需要阅读包含
userLikedPosts
数组的文档。您只需要在显示用户是否喜欢该帖子时阅读它,并且只需要在后续的帖子页面访问时阅读它。当用户按下like时,您可以立即在UI中做出响应,并按照上面的逻辑使用set/merge:true和ArrayUnion更新数据库。

谢谢!我已根据您的输入编辑了问题(如上)。这里有一些后续问题。更新我的答案…@Alvaro-99这能回答你的问题吗?谢谢!我正在努力,我会尽快让你知道的。你好!我刚刚完成这部分的工作,它工作得非常完美和顺利。再次感谢您的快速回复
docRef.set( {'userLikedPosts' : FieldValue.arrayRemove([documentId])}, {merge:true} );