我有一个功能,可以检查哪些书在Firestore中被收藏,书籍屏幕上有一个星形图标,我使用isFavorite函数来检查打开的书是否被用户收藏,如果是,则返回true并且图标需要将其颜色更改为黄色,如果不是,则返回false,颜色需要为黑色,但颜色不会改变。
updateFavorite功能可以在触摸图标时从Firestore中完美地添加和删除喜爱的书籍。
InkWell(
child: Icon(
Icons.star,
size: 30,
color: isFavorite == true ? Colors.yellow
: Colors.black,
),
onTap: (){
model.updateFavorite(model.getUserId(), document.documentID);
},
),
==============
Future<bool> isFavorite() async{
firebaseUser = await _auth.currentUser();
DocumentSnapshot favoritesRef = await Firestore.instance.collection("users")
.document(firebaseUser.uid).get();
if(favoritesRef.data["favorites"].contains(document.documentID)){
return true;
}
else {
return false;
}
}
==============
Future<bool> updateFavorite(Future<DocumentReference> uid, String bookId) async{
firebaseUser = await _auth.currentUser();
DocumentReference favoritesRef = Firestore.instance.collection("users")
.document(firebaseUser.uid);
return Firestore.instance.runTransaction((Transaction tx) async{
DocumentSnapshot postSnapshot = await tx.get(favoritesRef);
if(postSnapshot.exists){
if(!postSnapshot.data["favorites"].contains(bookId)){
await tx.update(favoritesRef, <String, dynamic>{
"favorites": FieldValue.arrayUnion([bookId])
});
// Delete de bookId from Favorites
} else {
await tx.update(favoritesRef, <String, dynamic>{
"favorites": FieldValue.arrayRemove([bookId])
});
}
}
}).then((result){
print(firebaseUser.uid);
print(bookId);
return true;
}).catchError((error){
print("Error: $error");
return false;
});
}
我建议你不要像isFavorite()
那样直接使用build
。 build
方法可能会被不断调用,它必须立即拥有所需的所有数据。 (并且必须处理缺少数据,例如,加载动画)
建议:
bool isFavorite
课堂上制作一个属性State
isFavorite()
改为_loadFavorite()
_loadFavorite()
,而不是返回值,使用isFavorite
更新属性setState()
_loadFavorite()
打电话给initState()
对于isFavorite
的默认值,你可以在initState()
上定义它,你可以设置一个默认值,如false
或保持它null
,并在你的build
方法进行检查,如果它是null
,然后不显示任何Icon
,例如(甚至是加载图标)。
如果你愿意,你可以aditionaly listen
到firestore引用来监视它是否被更改,如果有,你也可以使用setState()
更新状态。