将 Cupertino Datepicker 传递给另一个小部件

Passing Cupertino Datepicker to another widget

如何将数据从日期选择器传递到 _addCashButton 小部件?

我能够将日期分配给 newDateTime。我再次将它分配给 addDate 以保存到数据库,但它显示为 null

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);
      },
    );
  }
}

你在外面有 DateTime newDateTime; 并且你在 onDateTimeChanged: (DateTime newDateTime) {

中使用相同的名字

照原样,当 onDateTimeChanged 发生时,它的 newDateTime 不会更新 DateTime newDateTime;

一个快速更改是将此添加到 onDateTimeChanged:

this.newDateTime = newDateTime;

但是您应该将其中一个重命名为不同的名称,以免像这样混淆它。