将 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;
但是您应该将其中一个重命名为不同的名称,以免像这样混淆它。
如何将数据从日期选择器传递到 _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;
但是您应该将其中一个重命名为不同的名称,以免像这样混淆它。