Базовый запрос Firebase для изменения даты и времени

#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();
  }
}
  

Вы можете назвать это как-нибудь красивее 😉