我想检查Firebase集合中是否存在特定文档。据此,我的应用程序应显示彩色图标或灰色图标。我试图用一种方法解决这个问题,该方法返回布尔值。在我的Build Widget中,我调用该方法并分配正确的图标。
这是我检查文件是否存在的方法:
checkIfLikedOrNot(reference) async{
DocumentSnapshot ds = await reference.collection("likes").document(currentUser.uid).get();
print(ds.exists);
return ds.exists;
}
打印输出在控制台中显示正确的值,但是我的构建小部件似乎忽略了以下事实:布尔值是true,并且始终返回图标,如果集合中没有文档,则应显示该图标。
这是我的构建小部件的一部分:
GestureDetector(
child: checkIfLikedOrNot(list[index].reference) == true
?
Icon(
Icons.favorite,
color: Colors.red,
)
:
Icon(
FontAwesomeIcons.heart,
color: null,
),
)
此语句在哪里出问题?有什么想法吗?
最诚挚的问候。
答案 0 :(得分:1)
根据您的用例,您可以使用FutureBuilder,也可以使其简单并创建一个变量来处理逻辑:
在小部件内部:
bool isLiked = false;
从initState()中调用函数:
@override
void initState() {
super.initState();
checkIfLikedOrNot();
}
更改逻辑以修改变量,并告诉Flutter重新渲染:
checkIfLikedOrNot() async{
DocumentSnapshot ds = await reference.collection("likes").document(currentUser.uid).get();
this.setState(() {
isLiked = ds.exists;
});
}
绘制相应的图标:
Icon(isLiked?Icons.favorite:FontAwesomeIcons.heart,
color: isLiked?Colors.red:null)
编辑:由于您显然正在处理值列表,因此将它们封装在Object中或使用FutureBuilder是很有意义的。