【问题标题】:A simple Query in flutter/firebase databaseflutter/firebase 数据库中的一个简单查询
【发布时间】: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?

标签: firebase firebase-realtime-database flutter


【解决方案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;

【讨论】:

    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 2018-09-21
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多