Хобрук: Ваш путь к мастерству в программировании

Я хочу получить текущие пользовательские данные из базы данных firebase в моем приложении flutter

Мой вопрос в том, что я хочу получить данные только текущего пользователя. но этот код ниже извлекает данные всех пользователей, присутствующих в моей базе данных. как я могу получить данные только и только текущего пользователя.

  1. Это код, с помощью которого я получаю данные из firebase (я использую Realtime DataBase). в этом «имени узла» находится поле, в котором хранятся мои данные.
class ShowDataPage extends StatefulWidget {
  @override
  _ShowDataPageState createState() => _ShowDataPageState();
}

class _ShowDataPageState extends State<ShowDataPage> {
  List<myData> allData = [];

  @override
  void initState() {
    DatabaseReference ref = FirebaseDatabase.instance.reference();
    ref.child('node-name').once().then((DataSnapshot snap) {
      var keys = snap.value.keys;
      var data = snap.value;
      allData.clear();
      for (var key in keys) {
        myData d = new myData(
          data[key]['name'],
          data[key]['message'],
          data[key]['profession'],
        );
        allData.add(d);
      }
      setState(() {
        print('Length : ${allData.length}');
      });
    });
  }
  1. Это код, из которого я загружаю свои данные в базу данных под именем «имя-узла». этот код хранится в другом файле и также имеет другие необходимые поля, но это поле, которое загружает мои данные в firebase.
_sendToServer() {
    if (_key.currentState.validate()) {
      _key.currentState.save();
      DatabaseReference ref = FirebaseDatabase.instance.reference();
      var data = {
        "name": name,
        "profession": profession,
        "message": message,
      };
      ref.child('node-name').push().set(data).then((v) {
        _key.currentState.reset();
      });
    } else {
      setState(() {
        _autovalidate = true;
      });
    }
  }
  1. Моя база данных в firebase выглядит так, как показано ниже.

введите описание изображения здесь


Ответы:


1

Используйте uid пользователя:

ref.child('node-name').child("M5CCSXQo3Upq5OC7y3lw").once()
.then((DataSnapshot snap) {...}

Если вы не знаете uid и не использовали его, то выполните запрос по имени в примере.

@override
void initState() {
    FirebaseAuth.instance.currentUser().then((user){
      fetchUser(user);
    });
}

fetchUser(FirebaseUser user)
{
  DatabaseReference ref = FirebaseDatabase.instance.reference();
  ref.child('node-name').child(user.uid).once().then((DataSnapshot snap) {
      var keys = snap.value.keys;
      var data = snap.value;
      allData.clear();
      for (var key in keys) {
        myData d = new myData(
          data[key]['name'],
          data[key]['message'],
          data[key]['profession'],
        );
        allData.add(d);
      }
      setState(() {
        print('Length : ${allData.length}');
      });
    });
}
18.04.2020
  • тип аргумента «будущая строка» не может быть назначен типу параметра «строка». эта ошибка возникает, когда я пытаюсь ввести в нее текущий пользовательский uid. на самом деле я получаю uid также из firebase, используя функцию getUserID (). 19.04.2020
  • Просто используйте: await в качестве префикса для вызова .currentUser (). или используйте: .currentUser (). then ((user) {this.user = user}); 19.04.2020
  • Я добавил await async, но поскольку все это было внутри initState, я не смог этого сделать. поэтому я поместил весь этот текущий код в виджет с функцией async, добавил ожидание и вызвал его из initstate. но я, кажется, ничего не возвращаю. возвращается пустая страница. что может быть причиной этого 19.04.2020
  • Просто используйте версию .then внутри initState, а внутри .then вызовите функцию, в которой есть вызов FirebaseDatabase. 19.04.2020
  • Я обновил ответ, он должен быть примерно таким. Теперь вы должны увидеть, как это работает. Есть много других подходов к этому. Их здесь сложно объяснить. 19.04.2020
  • да, теперь я понял. Большое спасибо за твою помощь. обновленный ответ действительно помог 19.04.2020
  • Позвольте нам продолжить это обсуждение в чате. 19.04.2020

  • 2

    вы можете использовать это так

    ...
    ref.child('node-name').child('/** current_user_key **/').once()
    ...
    
    18.04.2020
    Новые материалы

    Прогресс в технологии Трансформеров часть 3
    Многомасштабный управляющий сигнальный преобразователь для бесфазного синтеза движения (arXiv) Автор: Линтао Ван , Кун Ху , Лей Бай , Юй Дин , Ваньли Оуян , Чжиюн Ван . Аннотация:..

    Представляем поддержку компонентов Vue.js. Мгновенный HMR и многое другое.
    Хотя у FuseBox уже был плагин Vue, он был базовым и не имел многих функций, которые делали работу с Vue.js такой приятной. Однако с этим выпуском мы рады сообщить, что в FuseBox..

    Приключения в Javascript, часть 1
    Я продолжаю думать о том, чтобы писать больше, но чем больше я думаю об этом, тем меньше я это делаю. Итак, сегодня я перестал думать и начал писать. Отсюда можно только спускаться… В..

    Понимание дженериков в TypeScript: подробное руководство
    Введение TypeScript, строго типизированный надмножество JavaScript, хорошо известен своей способностью улучшать масштабируемость, удобочитаемость и ремонтопригодность приложений. Одной из..

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..