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 - 搜索包含字符串的文档

Flutter Firebase 检索不同的用户数据

Flutter:Firebase 身份验证和 Firestore 快照流

Flutter:Xcode 中的 firebase_admob 构建失败

Flutter:FireBase 抛出的 PlatformException 不会被捕获

Flutter Firebase Auth - PHP 服务器中的令牌验证问题