как получить значение текстового поля flutter в datepicker

#flutter #dart

#flutter #дротик

Вопрос:

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

           Stack(
                alignment: Alignment.centerRight,
                children: [
                  TextFormField(
                    controller: birthDateInputController,
                    validator: Utils.birthDateValidator,
                    inputFormatters: [
                      FilteringTextInputFormatter.singleLineFormatter,
                      birthDateInput,
                    ],
                  ),
                  IconButton(
                    icon: Icon(
                      Icons.calendar_today_rounded,
                    ),
                    onPressed: () async {
                      FocusScope.of(context).requestFocus(FocusNode());
                      DateTime pickedDate = await showDate();
                      if (pickedDate != null) {
                        setState(() {
                          intl.DateFormat formatter =
                              intl.DateFormat('MM/dd/yyyy');
                          String formatted = formatter.format(pickedDate);
                          birthDateInputController.text = formatted;
                          birthDate = pickedDate;
                        });
                      }
                    },
                  ),
                ],
              ),

Future<DateTime> showDate() async {
return await showDatePicker(
  context: context,
  initialDate: DateTime.now(),
  firstDate: DateTime(1920),
  lastDate: DateTime.now(),
);
 

}

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

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

1. добавьте прослушиватель OnChanged в контроллер текстового поля (birthDateInputController), затем измените дату в этом методе и передайте измененную дату в метод showDate() !

Ответ №1:

Для присвоения DatePicker. вам нужно добавить пару вещей в Future<DateTime> showDate(String dateTime)

     Future<DateTime> showDate(String dateTime) async {
    DateTime _dateTime;
    if (dateTime.isNotEmpty) {
      _dateTime = DateFormat('MM/dd/yyyy').parse(dateTime);
    } else {
      _dateTime = DateTime.now();
    }
    return await showDatePicker(
      context: context,
      initialDate: _dateTime,
      firstDate: DateTime(1920),
      lastDate: DateTime.now(),
    );
  }
 

Передайте свой текст в этом методе showDate() в onPressed

  onPressed: () async {
                  FocusScope.of(context).requestFocus(FocusNode());
                  DateTime pickedDate = await showDate(birthDateInputController.text);
                  if (pickedDate != null) {
                    setState(() {
                      intl.DateFormat formatter =
                          intl.DateFormat('MM/dd/yyyy');
                      String formatted = formatter.format(pickedDate);
                      birthDateInputController.text = formatted;
                      birthDate = pickedDate;
                    });
                  }
                },
 

И в TextFormField вам нужно только передать число и косую черту для этого

  TextFormField(
                controller: birthDateInputController,
                validator: Utils.birthDateValidator,
                keyboardType: TextInputType.datetime, // use this parameter
                inputFormatters: [
                  FilteringTextInputFormatter.singleLineFormatter,
                  FilteringTextInputFormatter.allow(RegExp('[0-9/]')), // for numbers only
                  LengthLimitingTextInputFormatter(10), //set the number limit including slash
                  birthDateInput,
                ],
              ),
 

Сделайте проверку правильности формата даты при вводе текста

Ответ №2:

В вашей функции showDate(), которую вы использовали initialDate: DateTime.now() , которая принимает сегодняшнюю дату в качестве начальной даты

Итак, теперь вы должны установить initialDate как вручную

Попробуйте реализовать метод showDate (), например

 Future<DateTime> showDate(int year, int month, int day, int hr, int min, int sec) async {
    return await showDatePicker(
      context: context,
      initialDate: DateTime(year, month, day, hr, min, sec),
      firstDate: DateTime(1920),
      lastDate: DateTime.now(),
    );
  }
 

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

1. Спасибо, что приняли мой ответ. вы тоже могли бы дать мне преимущество.