Как получить данные в базе данных Firebase в режиме реального времени

# #firebase #flutter #dart #firebase-realtime-database

Вопрос:

Я создаю приложение для сохранения и отображения истории припадков пациентов. Поскольку я новичок в Flutter, у меня возникли трудности с получением данных из firebase для текущего пользователя на дату, выбранную в календаре.

Я храню данные в базе данных в реальном времени, поэтому для этого я использую дату как дочернюю, и если произошло более 1 раза изъятие, то он сохранит данные с новым ключом под той же датой. Я хочу получить эти данные на дату, поскольку они хранятся в firebase, как это:

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

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

ОБНОВЛЕННЫЙ КОД:

состояние инициализации:

   @override
  void initState() {
    var dateTime = DateTime.now();
    _date = "${dateTime.day}-${dateTime.month}-${dateTime.year}";
    //call the load method
    loadData();

    setState(() {
      _controller = CalendarController();
    });
  }
 

загрузка Данных:

  loadData() {
    list.clear();
    print(_date);
    //load the data from firebase and add to the list
    fb.reference()
      ..child(cuser.uid)
          .child('Seizure_history')
          .child(_date)
          .once()
          .then((DataSnapshot snapshot) {
        var data = snapshot.value;
        data.forEach((key, value) {
          EventList seizure_history = new EventList(
            seiz_duration: value['duration'],
            dateTime: value['datetime'],
            key: key,
          );
          list.add(seizure_history);
        });
        setState(() {
          print("History Present");
        });
      });

  }
 

Календарь :

 onDaySelected: (date, events, _) {
                    //print(TimeOfDay.fromDateTime(date));
                    print(date);
                    print(_focusedDay);
                    var datesel = "${date.day}-${date.month}-${date.year}";
                    //set the date
                    setState(() {
                      _date = datesel.toString();
                      //call the method again
                      loadData();
                    });

                  },
 

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

Это то, что он показывает на каждом свидании:

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

Поскольку в БД есть данные только за 2-6-2021 годы, но она показывает одни и те же данные на каждую дату. Однако он должен отображать это в случае, если дата не содержит данных в базе данных Firebase: (Рисунок ниже-дизайн пользовательского интерфейса)

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

Ответ №1:

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

 loadData(){
  //first clear the list once you dont need the other result
  list.clear();
  
  //load the data from firebase and add to the list
  //i think you could use once(), cause you dont need you listen every date
  fb.reference()
      ..child(cuser.uid).child('Seizure_history').child(_date).once();

 //then you add the result to the cleared list remember call setstate to reload the ui
}
 

Затем в методе initState вы задаете исходные данные и вызываете метод загрузки:

   @override
  void initState() {
    var dateTime = DateTime.now();
    //use the global variable instead of creating a local one
    _date = "${dateTime.day}-${dateTime.month}-${dateTime.year}";
    
   //call the load method
   loadData();
  }
 

Затем при изменении даты в календаре вы устанавливаете новый день и снова вызываете метод загрузки.

 onDaySelected: (date, events, _) {
   //print(TimeOfDay.fromDateTime(date));
   print(date);
   print(_focusedDay);
   var datesel = "${date.day}-${date.month}-${date.year}";
   
   //set the date
   _date = datesel.toString();
   //call the method again
   loadData();
},
 

Я вложил в идею только часть кода, надеюсь, вы сможете заставить ее работать.

Комментарии:

1. Я соответствующим образом изменю свой код и свяжусь с вами с обратной связью

2. Что вы подразумеваете под «вызовом setstate для перезагрузки пользовательского интерфейса» ?

3. Когда вы помещаете элементы в список, вам нужно перезагрузить состояние на экране, перестроить и отобразить изменения в списке, как вы сделали в добавленной истории печати состояния инициализации. Понял?

4. Да, я понял это, но я все еще не уверен в перезагрузке пользовательского интерфейса в заданном состоянии, я никогда не делал этого раньше.

5. Когда вы вызываете set state, виджеты перезагружаются, чтобы отобразить новое состояние. Поэтому каждый раз, когда вы вызываете состояние set, вызывается метод сборки и перестраиваются все виджеты.