#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. Спасибо, что приняли мой ответ. вы тоже могли бы дать мне преимущество.