Передача Купертино Datepicker в другой виджет - PullRequest
1 голос
/ 25 октября 2019

Как передать данные из средства выбора даты в виджет _addCashButton?

Мне удалось назначить дату для newDateTime. Я снова присвоил ему значение addDate для сохранения в базе данных, но оно становится пустым

class AddCashTab extends StatefulWidget {
  const AddCashTab({
    Key key,
  }) : super(key: key);
  @override
  _AddCashTabState createState() => _AddCashTabState();
}

class _AddCashTabState extends State<AddCashTab> {
  DateTime newDateTime;
  DateTime date = DateTime.now();

  @override
  void initState() {
    super.initState();
    controller = TextEditingController();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          _addDateButton(context),
          _addCashButton(context),
        ],
      ),
    );
  }

  Widget _addDateButton(BuildContext context) {
    return GestureDetector(
      onTap: () {
        showCupertinoModalPopup<void>(
          context: context,
          builder: (BuildContext context) {
            return _buildBottomPicker(
              CupertinoDatePicker(
                mode: CupertinoDatePickerMode.date,
                initialDateTime: date,
                onDateTimeChanged: (DateTime newDateTime) {
                  setState(() {
                    date = newDateTime;
                    print(newDateTime);
                  });
                },
              ),
            );
          },
        );
      },
      child: _buildMenu(
        <Widget>[
          // CupertinoButton.filled(
          //   child: Text('Select Date'),
          // ),
          const Text('Select Date'),
          Text(
            DateFormat.yMMMMd().format(date),
            style: const TextStyle(color: CupertinoColors.inactiveGray),
          ),
        ],
      ),
    );
  }

  Widget _addCashButton(BuildContext context) {
    return CupertinoButton.filled(
      child: Text('Add Cash'),
      onPressed: () {
        final database = Provider.of<AppDatabase>(context);
        final task = AddCashFlow(
          addName: controller.text,
          addDate: newDateTime,
        );
        database.insertAddCash(task);
      },
    );
  }
}

1 Ответ

1 голос
/ 25 октября 2019

У вас есть DateTime newDateTime; снаружи, и вы используете то же имя в onDateTimeChanged: (DateTime newDateTime) {

Как и в случае, когда onDateTimeChanged происходит, его newDateTime не будет обновлять DateTime newDateTime;.

Одно быстрое изменение - добавьте это к onDateTimeChanged:

this.newDateTime = newDateTime;

Но вы должны переименовать один из них по-другому, чтобы не путать его вот так.

...