检查 Firebase 中是否存在文档并根据图标返回

Mar*_*ert 6 conditional-statements firebase flutter google-cloud-firestore

我想检查 Firebase 集合中是否存在特定文档。据此,我的应用程序应该显示一个彩色图标或灰色图标。我试图用一种方法来解决这个问题,它返回一个布尔值。在我的 Build Widget 中,我调用该方法并分配正确的图标。

这是我检查文档是否存在的方法:

checkIfLikedOrNot(reference) async{
   DocumentSnapshot ds = await reference.collection("likes").document(currentUser.uid).get();
   print(ds.exists);
   return ds.exists;
}
Run Code Online (Sandbox Code Playgroud)

打印在控制台中显示了正确的值,但我的构建小部件似乎忽略了一个事实,即布尔值为 true 并始终返回应该在集合中没有文档时显示的图标。

这是我的构建小部件的一部分:

 GestureDetector(
      child: checkIfLikedOrNot(list[index].reference) == true

      ? 
         Icon(
          Icons.favorite,
          color: Colors.red,
         )
      : 
         Icon(
         FontAwesomeIcons.heart,
         color: null,
         ),
 )
Run Code Online (Sandbox Code Playgroud)

这个说法哪里有问题?有任何想法吗?

Tho*_*mas 6

根据您的用例,您可以使用FutureBuilder,或者保持简单并创建一个变量来处理逻辑:

在您的小部件内:

bool isLiked = false;
Run Code Online (Sandbox Code Playgroud)

从 initState() 中调用您的函数:

@override
void initState() {
    super.initState();
    checkIfLikedOrNot();
}
Run Code Online (Sandbox Code Playgroud)

更改逻辑以修改变量并告诉 Flutter 重新渲染:

    checkIfLikedOrNot() async{
       DocumentSnapshot ds = await reference.collection("likes").document(currentUser.uid).get();
        this.setState(() {
          isLiked = ds.exists;
        });

    }
Run Code Online (Sandbox Code Playgroud)

绘制相应的Icon:

Icon(isLiked?Icons.favorite:FontAwesomeIcons.heart,
     color: isLiked?Colors.red:null)
Run Code Online (Sandbox Code Playgroud)

编辑:由于您显然正在处理一系列值,因此将它们封装在一个对象中或使用 FutureBuilder 是有意义的。

  • 这是预期的行为,因为“.get()”总是只获取一次快照。如果您想在发生变化时监听它们,则需要一个 [StreamBuilder](https://docs.flutter.io/flutter/widgets/StreamBuilder-class.html)。然后,您可以将流设置为您喜欢的快照,只要您的 Firestore 中有更新,它就会更新并重建视图。 (2认同)