如何从Firebase实时数据库单独访问指定字段(如name)
如何从Firebase实时数据库的嵌套结构中获取name字段值
从你打印的输出能看到,返回的数据是嵌套Map结构:外层以用户ID为键,内层才是包含name、isHost等属性的用户信息Map。直接用event.snapshot.value['name']会失败,因为外层没有name这个键。
解决方案1:仅单个用户的场景
如果players节点下只有一个用户,可直接取第一个值获取用户信息:
DatabaseReference playersRef = FirebaseDatabase.instance.ref().child("rooms/$roomCode/players"); playersRef.onValue.listen((DatabaseEvent event) { print("====="); // 将快照值转为Map类型 Map<dynamic, dynamic> playersMap = event.snapshot.value as Map<dynamic, dynamic>; // 获取第一个用户的信息Map Map<dynamic, dynamic> userInfo = playersMap.values.first; // 提取name字段 String userName = userInfo['name'] as String; print(userName); // 输出 Maurice Azmy // 也可提取其他字段 bool isHost = userInfo['isHost'] as bool; print(isHost); print("====="); });
解决方案2:多个用户的场景
如果players节点下有多个用户,需要遍历外层Map逐个获取用户信息:
DatabaseReference playersRef = FirebaseDatabase.instance.ref().child("rooms/$roomCode/players"); playersRef.onValue.listen((DatabaseEvent event) { print("====="); Map<dynamic, dynamic> playersMap = event.snapshot.value as Map<dynamic, dynamic>; // 遍历所有用户 playersMap.forEach((userId, userInfo) { String userName = userInfo['name'] as String; String userId = userInfo['id'] as String; bool isJudge = userInfo['isJudge'] as bool; print("用户ID: $userId,用户名: $userName,是否为裁判: $isJudge"); }); print("====="); });
关键说明
你的数据结构层级是:rooms/$roomCode/players/{用户ID}/{用户属性},必须先通过外层的用户ID键,拿到对应的用户属性Map,才能访问name等具体字段。
内容的提问来源于stack exchange,提问作者Maurice Medhat
相关产品推荐
相关产品推荐

