获取flutter firebase实时数据库中特定字段的值

c9qzyr3d  于 2023-04-22  发布在  Flutter
关注(0)|答案(1)|浏览(128)

我想从firebase realtime数据库中获取一个特定用户的值,但是当我尝试这样做时,值总是空的。但是当我打印整个对象时,它工作得很好。

void getType(String email) {
final ref = FirebaseDatabase.instance.ref();
ref
    .child('users')
    .orderByChild('Email')
    .equalTo(email)
    .once()
    .then((DatabaseEvent snap) {
  if (snap.snapshot.value != null) {
    Map<dynamic, dynamic>? data =
        snap.snapshot.value as Map<dynamic, dynamic>?;
    String? userType = data?["userType"] as String?;
    print('User type: $userType');

    print('Data : ${snap.snapshot.value}');
  } else {
    print('No data found for email: $email');
  }
});

}

下面是print('Data : ${snap.snapshot.value}');的输出:
数据:{-NTVZFFxx1fi4Aj4X_nZ:{电子邮件:yy@tt.com,电话号码:4,ID:66768,userType:办公室,名称:ss}}。
您可以看到它工作正常,另一方面,“print('User type:');“是:(用户类型:null)

xggvc2p6

xggvc2p61#

当您对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也将包含一个结果的列表。
你的代码没有考虑这个列表。要做到这一点,你应该循环遍历snapshot中的结果:

.then((DatabaseEvent event) {
  DataSnapshot snapshot = event.snapshot;
  if (snapshot.exists) {
    snapshot.forEach((child) {
      Map<dynamic, dynamic> data = child.value! as Map<dynamic, dynamic>;
      String? userType = data["userType"] as String?;
      print('User type: $userType');
    })
  } else {
    print('No data found for email: $email');
  }
})

相关问题