#flutter #dart
#flutter #dart
Вопрос:
Я пытаюсь сделать мой datepicker многоразовым, поскольку мне нужны три datepickers, которые изменяют разные значения, хранящиеся в одном классе, давайте назовем это _object.date1 , date 2, date 3
Чтобы повторно использовать мой datepicker, я попробовал следующее и передал переменную в datepicker, которая должна быть изменена. Но тогда значение поля не изменяется и не сохраняется, и ничего не происходит, также нет ошибки. Если я не передаю значение в _showAndroidDatePicker() и не использую строку в setState, которую я прокомментировал ниже, она работает должным образом. Средство выбора даты связано с onTap текстового поля в форме.
Кто-нибудь может объяснить мне, чего мне здесь не хватает? Было бы действительно здорово сделать это повторно используемым.
Большое спасибо!
void _showAndroidDatePicker(value) {
showDatePicker(
context: context,
builder: (BuildContext context, Widget child) {
return Theme(
data: ThemeData.light().copyWith(
primaryColor: Theme.of(context).primaryColor,
accentColor: Theme.of(context).primaryColor,
colorScheme:
ColorScheme.light(primary: Theme.of(context).primaryColor),
buttonTheme: ButtonThemeData(textTheme: ButtonTextTheme.primary),
),
child: child,
);
},
initialDate: DateTime.now(),
locale: Locale('de'),
firstDate: DateTime(1900),
helpText: 'Bitte wähle ein Datum aus',
lastDate: DateTime.now(),
).then<DateTime>(
(DateTime newDate) {
if (newDate != null) {
setState(() {
value = newDate.toIso8601String();
//Below code works if value isn't passed to datepicker, but I want it variable to avoid boilerplate
// _object.date1 =newDate.toIso8601String();
});
}
return;
},
);
}
Большое спасибо за вашу помощь!
Ответ №1:
Вы могли бы передать ему контроллер и узел фокусировки для текстового поля. Что-то вроде этого:
datePickerListener(node, controller) {
if (node.hasFocus) {
node.unfocus();
showDatePicker(your setup).then((date){
var formatter = DateFormat('dd/MM/yyyy');
var formatted = formatter.format(date).toString();
controller.text = formatted;
});
}
}
Затем:
FocusNode yourNode = FocusNode();
@override
void initState(){
yourNode.addListener(){
datePickerListener(yourNode, yourController);
};
}
TextFormField(
focusNode: yourNode,
controller: yourController,
)
Что-то вроде этого. Просто подстраивайтесь под свои потребности.