Простой запрос в базе данных flutter / firebase - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь использовать базу данных Firebase Live с флаттером.Я просто хотел бы получить значение в datasnapshot ответа Firebase.

My Firebase

enter image description here

Мой код

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= '';
    }
  }
}

Я получил нулевое значение для имени.Я думаю, что я должен перейти к ребенку из snapshot.value.Но невозможно управлять с помощью foreach или Map (), ...

С уважением, Джером

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Это даст вам пользователей в диалоговом окне.Если вы не используете потоковые и потоковые компоновщики, вам может быть оказана небольшая медвежья услуга. Приведенное ниже решение представляет собой одноразовую выборку пользовательской коллекции в 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;
0 голосов
/ 23 мая 2018

Вы запрашиваете запрос и документацию для запросов ( здесь, в 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...