我正在尝试创建一个包含时间选择器列表的表单。这个想法是用户可以输入他/她的出发地和(可选)到达多天的时间和日期。用户将可以使用常规工作日输入特定日期或更具体的日期,而常规工作日将自动选择下一个工作日。
因此,我使用Listview.builder创建了一个列表,该列表对包含三个弹出日期选择器的卡片进行了迭代。一个用于日期,一个用于出发时间(时间A)和到达时间(时间B)。我用一个枚举来选择一个特定的日期或一周中的某一天。我在卡上放了一个Icon按钮,它将激活addDayTime函数。
我使用initState将初始值设置为今天+“索引”天数。
现在我正在尝试将卡中的值存储在一个列表中,因此我可以将此对象输出到另一个列表中。
我试图将datetimepickers的值存储在单独的对象中,并创建一个add函数,将这些值合并到一个列表中,该列表包含两个(带有一个可选的)完整日期,并包含每天选择的时间。
我还尝试使用iconbutton存储值,并使用update方法在索引处为各个选择器的onconform方法进行更新。
我已经尝试过使用两个单独的日期列表,分别使用带有图标按钮的添加和更新方法,如果不为空则将更新,如果为空则将添加日期。
@override
void initState() {
super.initState();
_return = true;
_nextDayOfWeek = _nextWorkingDay().add(Duration(days: widget.index + 1));
_date = DateTime.parse(
DateTime.now().add(Duration(days: widget.index)).toString());
_timeA = DateTime.parse(
DateTime.now().add(Duration(days: widget.index)).toString());
_timeB = DateTime.parse(
DateTime.now().add(Duration(days: widget.index)).toString());
_dateTimeA= DateTime.parse(
'${_date.year.toString().padLeft(2, '0')}-${_date.month.toString().padLeft(2, '0')}-${_date.day.toString().padLeft(2, '0')}')
.add(Duration(hours: _timeA.hour, minutes: _timeA.minute));
_dateTimeB = DateTime.parse(
'${_date.year.toString().padLeft(2, '0')}-${_date.month.toString().padLeft(2, '0')}-${_date.day.toString().padLeft(2, '0')}')
.add(Duration(hours: _timeB.hour, minutes: _timeB.minute));
}
DateTime _nextWorkingDay() {
if (widget.index == DateTime.now().weekday) {
return DateTime.now();
} else if (widget.index > DateTime.now().weekday) {
return DateTime.now().add(Duration(days: 7 + DateTime.now().weekday));
} else {
return DateTime.now()
.add(Duration(days: DateTime.now().weekday - widget.index));
}
}
void _showDatePicker() {
DatePicker.showDatePicker(
context,
minDateTime: DateTime.parse(_date.toString()),
maxDateTime: DateTime.parse(maxDateTime),
initialDateTime: widget.timeMode == TimeMode.Fixed
? DateTime.parse(_nextDayOfWeek.toString())
: DateTime.parse(_date.toString()),
dateFormat: _formatDay,
pickerMode: DateTimePickerMode.date, // show TimePicker
//
onCancel: () {
debugPrint('onCancel');
},
onChange: (date, List<dynamic> index) {
setState(() {
_date = date;
});
},
);
}
void _showTimePicker() {
DatePicker.showDatePicker(context,
minDateTime: DateTime.parse(minDateTime),
maxDateTime: DateTime.parse(maxDateTime),
initialDateTime: DateTime.parse(_date.toString()),
dateFormat: _format,
pickerMode: DateTimePickerMode.time, // show TimePicker
//
onCancel: () {
debugPrint('onCancel');
}, onChange: (timeA, List<dynamic> index) {
setState(() {
_timeA = timeA;
});
}, onConfirm: (
dateTimeA,
List<dynamic> index,
) {
_dateTimeA = DateTime.parse(
'${_date.year.toString().padLeft(2, '0')}-${_date.month.toString().padLeft(2, '0')}-${_date.day.toString().padLeft(2, '0')}')
.add(Duration(hours: _timeA.hour, minutes: _timeA.minute));
setState(() {
_dateTimeA = dateTimeA;
});
});
}
void _showTimeBPicker() {
DatePicker.showDatePicker(context,
minDateTime: DateTime.parse(minDateTime),
maxDateTime: DateTime.parse(maxDateTime),
initialDateTime: DateTime.parse(_date.toString()),
dateFormat: _format,
pickerMode: DateTimePickerMode.time, // show TimePicker
//
onCancel: () {
debugPrint('onCancel');
}, onChange: (timeB, List<dynamic> index) {
setState(() {
_timeB = timeB;
});
}, onConfirm: (dateTimeB, List<dynamic> index) {
_dateTimeB = DateTime.parse(
'${_date.year.toString().padLeft(2, '0')}-${_date.month.toString().padLeft(2, '0')}-${_date.day.toString().padLeft(2, '0')}')
.add(Duration(hours: _timeB.hour, minutes: _timeB.minute));
setState(() {
_dateTimeB = dateTimeB;
});
});
}
void _submitDayTime() {
final Map<String, dynamic> _dayTime = {
'dayTimeA': _dateTimeA,
'dayTimeB': _dateTimeB,
};
widget.addDayTime(_dayTime);
}
在视觉上,屏幕可以正常工作。它会按照设计显示适当的内容,并且能够在工作日和日期之间切换。问题在于存储和输出内容。我不断返回错误和死胡同。 这是最新的:
RangeError(索引):无效值:有效值范围为空:0