创建并存储多个时间/日期选择器的列表

时间:2019-06-24 10:58:29

标签: flutter dart

我正在尝试创建一个包含时间选择器列表的表单。这个想法是用户可以输入他/她的出发地和(可选)到达多天的时间和日期。用户将可以使用常规工作日输入特定日期或更具体的日期,而常规工作日将自动选择下一个工作日。

因此,我使用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

0 个答案:

没有答案