Повторное использование Datepicker для разных значений полей

#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,
              )
  

Что-то вроде этого. Просто подстраивайтесь под свои потребности.