firebase - 来自 Firestore 的实时数据颤动不起作用
问题描述
我正在关注本教程,了解如何从 Flutter Firestore 获取实时更新,
https://medium.com/firebase-tips-tricks/how-to-use-cloud-firestore-in-flutter-9ea80593ca40 我向下滚动到Listen对于实时更新部分,当我按照教程进行操作时,这就是我想出的,
String name = 'name here';
String children = 'children here';
String docId = '0';
@override
void initState() {
getUsers();
super.initState();
}
getUsers() async {
final FirebaseAuth auth = FirebaseAuth.instance;
final User? user = auth.currentUser;
final uid = user!.uid;
FirebaseFirestore.instance
.collection("userNames")
.where("uid", isEqualTo: uid)
.snapshots()
.listen((result) {
result.docs.forEach((result) {
print(result["firstName"]);
print(result["children"].toString());
name = result["firstName"];
children = result["children"].toString();
});
});
}
当我将值打印到控制台时,它们会实时更新,但是当我将它们放入变量并将它们连接到 Text 小部件中时,如下所示:
Text('Children: $children'), //It does not update in realtime.
例如,如果在我的文档中如果我有children: 3
并且我在我的应用程序中显示,它会显示 3,但是当我手动更改它时,它不会实时更新,我必须按下热重载。另一个问题是我必须在函数中使用它们之前初始化变量,在前 3 行代码中。当我热启动时,它会显示我用来初始化它们的值。对于应该显示孩子的位置,它会显示“这里的孩子”,对于名称所在的位置,它会放置“此处的名称”,只有当我热重新加载页面时,才会将实际的 firestore 值输入到其中并显示来自 firestore 的数据数据库。如果有任何这些问题的解决方案,我更喜欢代码中的答案,而不是链接或简短的解释,我花了几个小时才找到一段利用解释的代码。
解决方案
由于数据是异步加载的,因此在 Flutter 首次绘制小部件时数据不可用Text
。您需要告诉 Flutter,当数据可用时它必须重新绘制 UI。
有两种常见的方法可以做到这一点:
- 通过调用将
children
变量置于小部件的状态中setState()
。这将告诉 Flutter 重新绘制小部件,然后您的文本将显示该值。 - 您还可以使用一个
StreamBuilder
小部件,它也可以执行上述操作 - 但它也会自动处理各种错误状态。
我建议阅读有关有状态小部件和setState
有关StreamBuilder
类的信息以了解更多信息。
推荐阅读
- python - 从 .txt(文本)文件解析表
- java - 使用 JDK>=9 远程调试 yajsw 包装的应用程序
- nativescript-angular - Nativescript-angular tns 运行失败并出现错误错误:无法解析 ApplicationModule 的所有参数
- javascript - React 中的 Axios 请求问题
- amazon-redshift - 我们是否可以使用 debezium 在目标数据库(redshift)中创建每日快照作为行
- java - 如何将多个枚举数据写入单个 pojo 并将其作为列表返回
- jhipster - 在 jhipster 单体应用程序上创建角色层次结构
- azure - ##[错误]未处理:句柄不是 Azure DevOps 构建管道中的缓冲区 CopyFilesOverSSH
- javascript - 从渲染画布而不是整个窗口中获取坐标
- html - 使用令人敬畏的字体提高可访问性来传达含义