【问题标题】:Check if documents exists in Firebase and return according icon检查 Firebase 中是否存在文档并根据图标返回
【发布时间】:2019-09-16 15:28:21
【问题描述】:

我想检查 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,
         ),
 )

这句话的问题在哪里?有什么想法吗?

【问题讨论】:

  • 您确定可以在这样的构造函数中使用异步函数吗?异步函数不会立即返回其最终结果。
  • 不,我完全不确定 :D 你知道我如何在没有异步的情况下重写函数吗?
  • 不,Firestore API 都是异步的。在使用结果之前,您必须等待查询完成。
  • 如何等待查询?我认为 await 可以处理......
  • 即使你的函数中有 await ,你的函数仍然返回未来,因为它被标记为异步。在这种情况下,我会做的是,在 init 状态下调用函数,等待它的结果,然后使用 setState 将其设置为您的状态中的某个变量。然后在手势检测器的三元运算符中使用它。

标签: firebase flutter google-cloud-firestore conditional-statements


【解决方案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:

Icon(isLiked?Icons.favorite:FontAwesomeIcons.heart,
     color: isLiked?Colors.red:null)

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

【讨论】:

  • 我用Futurbuilder 试过了,但Futurbuilder 似乎一开始只获取一次数据。它不会重建。所以当我点击like按钮时,控制台会注册更改,但我需要刷新页面才能看到更改。
  • 我删除了 FutureBuilder 并将值封装在一个自己的类中。现在我使用 setState 并且一切正常。不是最干净的解决方案,但它有效。
  • 这是预期的行为,因为.get() 总是只会获得一次快照。如果您想随时监听更改,您需要StreamBuilder。然后,您可以将流设置为您喜欢的快照,只要您的 Firestore 中有更新,它就会更新并重建视图。
猜你喜欢
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多