Flutter 从Dart的Firestore获取布尔状态
我试图在初始化应用程序时从Firestore获取bool值:如果是“like”,则返回True;如果不是“like”,则返回False。每次用户喜欢/不喜欢帖子时,Firestore上都会创建或更新一个数据库(称为userFavorites)。userFavorite数据库由以下部分组成:文档(用户ID)、集合(“帖子”)、文档(帖子ID)、集合(isLiked:true或isLiked:false)。因此,在初始化应用程序时,我尝试为UI上显示的每个帖子访问此True/False(如果用户从未喜欢或取消链接帖子,则此bool的值将自动为False) 如果您能就我用来从Firestore获取真/假布尔值的代码给我反馈/更正,我将不胜感激,因为即使我没有收到任何错误,我的IU上的布尔值也是空的,我不知道我是在代码的这一部分还是在另一部分出错 以下是我使用的代码: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(如果用户从未
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} );