flutter/firebase 数据库中的一个简单查询
Posted
技术标签:
【中文标题】flutter/firebase 数据库中的一个简单查询【英文标题】:A simple Query in flutter/firebase database 【发布时间】:2018-11-02 14:40:15 【问题描述】:我尝试用 Flutter 体验 Firebase Live 数据库。 我只想在 firebase 响应的数据快照中获得一个值。
我的火力基地
我的代码
static Future<User> getUser(String userKey) async
Completer<User> completer = new Completer<User>();
String accountKey = await Preferences.getAccountKey();
FirebaseDatabase.instance
.reference()
.child("accounts")
.child(accountKey)
.child("users")
.childOrderBy("Group_id")
.equals("54")
.once()
.then((DataSnapshot snapshot)
var user = new User.fromSnapShot(snapshot.key, snapshot.value);
completer.complete(user);
);
return completer.future;
class User
final String key;
String firstName;
Todo.fromJson(this.key, Map data)
firstname= data['Firstname'];
if (firstname== null)
firstname= '';
我的名字为 Null 值。 我想我应该导航到 snapshot.value 的子节点。但是用 foreach 或 Map() 管理是不可能的,...
亲切的问候,杰罗姆
【问题讨论】:
我对颤振不熟悉。但是您的数据库引用似乎与您的数据库不匹配:您使用的是.child("user")
,但在您的数据库中它是users
还有childOrderBy("Group_Id")
,你的数据库中有Group_id
。
好的,谢谢我更正了我的帖子。但我的真实代码是正确的。事实上,如果我使用 print(snapshot.value),我会收到响应 (JSON) 但我无法获得 snapshot.value['firstName']
你得到了什么对象作为 snapshot.value?
【参考方案1】:
您正在使用查询进行查询,查询的文档(here in javascript,但对所有语言都有效)说“即使查询只有一个匹配项,快照仍然是一个列表;它只包含一个项目。要访问该项目,您需要遍历结果。"
我不知道您应该如何在 Flutter/Dart 中循环遍历快照的子级,但您应该执行以下操作(在 JavaScript 中):
snapshot.forEach(function(childSnapshot)
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
// ...
);
并假设您的查询仅返回一条记录(“单匹配”),请在执行时使用子快照
var user = new User.fromSnapShot(childSnapshot.key, childSnapshot.value);
【讨论】:
不幸的是 foreach 在 DataSnapshot 上不可用。我通过将我的快照投射为地图来管理。谢谢大家 Map.forEach((dynamic, dynamic) → void f) → void dart.core 适用于 Dart-Fluter【参考方案2】:这将为您提供可重用对话框中的用户。如果您不使用流和流构建器,可能会对您自己造成轻微伤害,下面的解决方案是一次性获取 FirebaseDB 上的用户集合。
class User
String firstName, groupID, lastName, pictureURL, userID;
User(this.firstName, this.groupID, this.lastName, this.pictureURL, this.userID);
factory User.fromJSON(Map<dynamic, dynamic> user) => User(firstName: user["Firstname"], groupID: user["Group_id"], lastName: user["Lastname"], pictureURL: user["Picturelink"], userID: user["User_id"]);
Future<List<User>> users = Firestore.instance.collection("users").snapshots().asyncMap((users)
return users.documents.map((user) => User.fromJSON(user.data)).toList();
).single;
【讨论】:
以上是关于flutter/firebase 数据库中的一个简单查询的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:Firebase 身份验证和 Firestore 快照流
Flutter:Xcode 中的 firebase_admob 构建失败