# #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, вызывается метод сборки и перестраиваются все виджеты.