Flutter Firebase实时数据库获取指定字段值返回null问题
问题原因及解决方案
问题根源
你用orderByChild查询返回的结果是嵌套Map结构:顶层是Firebase自动生成的节点ID(比如-NTVZFFxx1fi4Aj4X_nZ),这个ID对应的value才是包含userType的用户数据对象。你直接访问data["userType"],相当于在顶层Map里找不存在的键,所以返回null。
修复代码
可以通过以下两种方式获取正确的userType:
方式1:遍历顶层Map的values取第一个结果
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>?; // 取顶层Map的第一个value(即用户数据对象) Map<dynamic, dynamic>? userData = data?.values.first as Map<dynamic, dynamic>?; String? userType = userData?["userType"] as String?; print('User type: $userType'); print('Data : ${snap.snapshot.value}'); } else { print('No data found for email: $email'); } }); }
方式2:通过DataSnapshot的children属性获取子节点
void getType(String email) { final ref = FirebaseDatabase.instance.ref(); ref .child('users') .orderByChild('Email') .equalTo(email) .once() .then((DatabaseEvent snap) { // 检查是否有匹配的子节点 if (snap.snapshot.children.isNotEmpty) { // 取第一个匹配的子节点 DataSnapshot userSnapshot = snap.snapshot.children.first; Map<dynamic, dynamic>? userData = userSnapshot.value as Map<dynamic, dynamic>?; String? userType = userData?["userType"] as String?; print('User type: $userType'); print('Data : ${snap.snapshot.value}'); } else { print('No data found for email: $email'); } }); }
说明
因为你是按唯一的Email查询,所以结果只会有一个子节点,用first直接取即可。如果业务场景中存在多个匹配项,可以遍历children或values处理每个结果。
内容的提问来源于stack exchange,提问作者Alzayer70
相关产品推荐
相关产品推荐

