【问题标题】:string name dose not change dart flutter字符串名称不会改变飞镖颤动
【发布时间】:2021-12-01 14:18:31
【问题描述】:

我将此代码中的字符串名称分配给文档中的名称,但它不会从 null 更改,我不明白为什么。

我将在 listTile 中使用这个变量

String name='';
    FirebaseFirestore.instance
        .collection('Users')
        .doc('list_students')
        .collection('Students')
      ..where('Email', isEqualTo: userEmail)
          .get()
          .then((QuerySnapshot querySnapshot) {
        querySnapshot.docs.forEach((doc) {
          name = doc['Full Name'];
        });
      }); 

【问题讨论】:

  • 您的大部分代码都是异步运行的,但您期望的是同步行为。不要使用then,您应该将您的方法标记为async,并使用awaitawait for 使您的代码更具可读性和更易于理解执行流程。
  • 如果添加print(doc['Full Name']); 语句,doc['Full Name'] 会打印什么?
  • 它将打印名称,但我想将其存储在变量中以在其他地方使用它

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:

正如评论者所说,您的大部分代码都是异步运行的,因为需要从云端加载数据。这会打乱代码运行的顺序,这可能是变量没有值的原因。

一些日志记录应该更清楚:

String name='';
print("1. Before starting query");
FirebaseFirestore.instance
    .collection('Users')
    .doc('list_students')
    .collection('Students')
  ..where('Email', isEqualTo: userEmail)
      .get()
      .then((QuerySnapshot querySnapshot) {
    print("2. Got data");
    querySnapshot.docs.forEach((doc) {
      name = doc['Full Name'];
    });
  }); 
print("3. After starting query");

当你运行这段代码时,输​​出将是:

  1. 开始查询之前

  2. 开始查询后

  3. 得到数据

这可能不是您预期的顺序,但实际上按预期工作。这意味着,如果您打印 name 来代替 3.,您将看不到数据库中的值。


解决方案总是一样的:需要数据库数据的代码需要在then回调中,或者需要从那里调用,或者需要同步运行数据已加载。

例如,如果您想在应用程序的 UI 中使用name,您可以将其存储在您的(有状态)小部件的状态中,如下所示:

setState(() {
  name = doc['Full Name'];
})

现在 Flutter 知道它需要在数据加载后更新 UI。

由于这种情况很常见,因此有一个专用的小部件来处理它,称为FutureBuilder。所以我建议你也阅读一下。

【讨论】:

    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多