#android #firebase #flutter #dart #google-cloud-firestore
#Android #firebase #флаттер #dart #google-облако-firestore
Вопрос:
Я пытаюсь написать программу, чтобы проверить, существует ли время, выбранное пользователем, уже в firebase firestore или нет. Если это произойдет, я вернусь на страницу, где они снова выбирают время.
Но на данный момент мне удалось отправить дату и время в firebase, но не последнюю часть.
DateTime _eventDate;
bool processing;
String _time;
bool conditionsStatisfied ;
@override
void initState() {
super.initState();
_eventDate = DateTime.now();
processing = false ;
}
внутри showDatePicker()
setState(() {
print('inside the setState of listTile');
_eventDate = picked ;
});
внутри кнопки (СОХРАНИТЬ):
onPressed: () async {
if (_eventDate != null) {
final QuerySnapshot result = await FirebaseFirestore
.instance
.collection('events')
.where('event_date', isEqualTo: this._eventDate)
.where('selected_time', isEqualTo: this._time)
.get();
final List <DocumentSnapshot> document = result.docs;
if (document.length > 0) {
setState(() {
print('inside the method matching conditions');
showAlertDialogue(context);
});
}else{
final data = {
// "title": _title.text,
'selected_time ': this._time,
"event_date": this._eventDate
};
if (widget.note != null) {
await eventDBS.updateData(widget.note.id, data);
} else {
await eventDBS.create(data);
}
Navigator.pop(context);
setState(() {
processing = false;
});
}
};
необходимы некоторые рекомендации о том, как мне решить эту проблему!
Кроме того, из-за оператора else теперь программа не будет записывать дату в firestore.
Комментарии:
1. eventDBS.updateData поступает из пакета firestoreHelper
2. ‘selected_time’ может быть пробелом?
3. @jiholee даже после этого никаких изменений.
Ответ №1:
После долгих исследований я пришел к выводу, что если вы отправляете данные из календаря в формате DateTime, то из-за метки времени в конце даты сопоставление с датами становится невозможным. Поэтому я отформатировал значение даты и времени в (ДД / ММ / ГГГГ).
Вот остальная часть кода для справки:
class _AddEventPageState extends State<AddEventPage> {
String _eventDate;
bool processing;
String _time;
@override
void initState() {
super.initState();
// _eventDate = DateTime.now();
processing = false ;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Please select a date'),),
body: Column(
children: [
hourMinute30Interval(),
Text('$_time'),
ListView(
scrollDirection: Axis.vertical,
shrinkWrap: true,
children: <Widget>[
ListTile(
title: Text(
'$_eventDate'),
onTap: () async {
DateTime picked = await showDatePicker(context: context,
initialDate: DateTime.now(),
firstDate: DateTime(DateTime.now().year - 1),
lastDate: DateTime(DateTime.now().year 10),);
if (picked != null) {
setState(() {
print('inside the setState of listTile');
_eventDate = DateFormat('dd/MM/yyyy').format(picked) ;
});
}
},
),
SizedBox(height: 10.0),
ListTile(
title: Center(
child: Text('Select time for appointment!', style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
),
),
),
),
processing
? Center(child: CircularProgressIndicator())
: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Material(
elevation: 5.0,
borderRadius: BorderRadius.circular(30.0),
color: Theme
.of(context)
.primaryColor,
child:MaterialButton(
child: Text('SAVE', style: TextStyle(
fontSize: 20,
color: Colors.white,
fontWeight: FontWeight.bold,
)),
onPressed: () async {
if (_eventDate != null) {
AddingEventsUsingRajeshMethod().getAvailableSlots(
_eventDate, _time).then((QuerySnapshot docs) async {
if (docs.docs.length == 1) {
showAlertDialogue(context);
}
else{
final data = {
// "title": _title.text,
'selected_time': this._time,
"event_date": _eventDate,
};
if (widget.note != null) {
await eventDBS.updateData(widget.note.id, data);
} else {
await eventDBS.create(data);
}
Navigator.pop(context);
setState(() {
processing = false;
});
}
});
}
}
),
),
),
],
),
],
),
);
}
Метод showAlertDialogue :
showAlertDialogue(BuildContext context) {
Widget okButton = FlatButton(onPressed: (){
Timer(Duration(milliseconds: 500), () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => datePicker()),
);
});
}, child: Text(' OK! '));
AlertDialog alert = AlertDialog(
title: Text('Slot unavailable'),
content: Text('This slot is already booked please select another slot'),
actions: [
okButton,
],
);
showDialog(context: context ,
builder: (BuildContext context){
return alert ;
}
);
}
hourMinute30Interval() — это не что иное, как виджет, который возвращает timePickerSpinner, который является пользовательским виджетом. Для этого нажмите здесь.
Запрос, который выполняется после передачи _eventDate и _time, относится к другому классу и выглядит следующим образом :
class AddingEventsUsingRajeshMethod {
getAvailableSlots(String _eventDate , String _time){
return FirebaseFirestore.instance
.collection('events')
.where('event_date', isEqualTo: _eventDate )
.where('selected_time', isEqualTo: _time)
.get();
}
}
Вы можете назвать это как-нибудь красивее 😉