如何在 Flutter 中使用 setState() 更新 ModalBottomSheet 的 ParentWidget?
How to update the ParentWidget of ModalBottomSheet using setState() in Flutter?
在我的 SingleDayCalendarView() 中,我有一个按钮调用 showModalBottomSheet() 并将 AddShiftBottomSheet 作为其子项:
class SingleDayCalendarView extends StatelessWidget {
...
onPressed: () {
showModalBottomSheet(
context: context,
isScrollControlled: true,
enableDrag: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(25),
topRight: Radius.circular(25),
),
),
builder: (BuildContext context) {
return AddShiftBottomSheet(
dayOfTheShift: id,
);
});
},
然后在 AddshiftBottomSheet 中,它是另一个文件中的有状态小部件,我调用另一个 showModalBottomSheet 来显示 TimePicker
class AddShiftBottomSheet extends StatefulWidget {
@override
Widget build(BuildContext context) {
DateTime _startDateTime;
...
Text("${DateFormat("HH:mm").format(_startDateTime)}",
showModalBottomSheet(
context: context,
builder: (BuildContext context) {
return Container(
height: 200,
color: Colors.white,
child: CupertinoDatePicker(
onDateTimeChanged: (dateTime) {
setState(() {
_startDateTime = dateTime;
});
print(_startDateTime);
},
问题是,当我使用 TimePicker 更改时间时,应该显示 _startDateTime 的 Text() 不会更改并继续显示其初始值。
通过 print 语句,我看到变量 _startDateTime 正在按应有的方式更改,并且触发了 setState,但没有任何反应。
一个奇怪的行为:如果我在 _startDateTime 变量之间:
class AddShiftBottomSheet extends StatefulWidget {
@override
_AddShiftBottomSheetState createState() => _AddShiftBottomSheetState();
}
//here
DateTime = _startDateTime;
class _AddShiftBottomSheetState extends State<AddShiftBottomSheet> {
一切正常。
从构建方法中删除 DateTime _startDateTime;
并将其定义在 class 范围内:
class AddShiftBottomSheet extends StatefulWidget {
DateTime _startDateTime;
@override
Widget build(BuildContext context) {
...
当您调用 setState
构建方法时再次调用,您在其中定义了 _startDateTime
。
在我的 SingleDayCalendarView() 中,我有一个按钮调用 showModalBottomSheet() 并将 AddShiftBottomSheet 作为其子项:
class SingleDayCalendarView extends StatelessWidget {
...
onPressed: () {
showModalBottomSheet(
context: context,
isScrollControlled: true,
enableDrag: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(25),
topRight: Radius.circular(25),
),
),
builder: (BuildContext context) {
return AddShiftBottomSheet(
dayOfTheShift: id,
);
});
},
然后在 AddshiftBottomSheet 中,它是另一个文件中的有状态小部件,我调用另一个 showModalBottomSheet 来显示 TimePicker
class AddShiftBottomSheet extends StatefulWidget {
@override
Widget build(BuildContext context) {
DateTime _startDateTime;
...
Text("${DateFormat("HH:mm").format(_startDateTime)}",
showModalBottomSheet(
context: context,
builder: (BuildContext context) {
return Container(
height: 200,
color: Colors.white,
child: CupertinoDatePicker(
onDateTimeChanged: (dateTime) {
setState(() {
_startDateTime = dateTime;
});
print(_startDateTime);
},
问题是,当我使用 TimePicker 更改时间时,应该显示 _startDateTime 的 Text() 不会更改并继续显示其初始值。 通过 print 语句,我看到变量 _startDateTime 正在按应有的方式更改,并且触发了 setState,但没有任何反应。
一个奇怪的行为:如果我在 _startDateTime 变量之间:
class AddShiftBottomSheet extends StatefulWidget {
@override
_AddShiftBottomSheetState createState() => _AddShiftBottomSheetState();
}
//here
DateTime = _startDateTime;
class _AddShiftBottomSheetState extends State<AddShiftBottomSheet> {
一切正常。
从构建方法中删除 DateTime _startDateTime;
并将其定义在 class 范围内:
class AddShiftBottomSheet extends StatefulWidget {
DateTime _startDateTime;
@override
Widget build(BuildContext context) {
...
当您调用 setState
构建方法时再次调用,您在其中定义了 _startDateTime
。