Сортировка даты для флажка флаттера / Планировщик даты - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть служба, которая возвращает список дат, которые пользователь может выбрать для будущего платежа.

В пользовательском интерфейсе есть три раскрывающихся списка, по одному для года, месяца и даты.

Теперь, когда пользователь выбирает конкретный год, тогда месяцы, показанные в следующем раскрывающемся списке, должны содержать только месяцы, соответствующие этому конкретному выбранному году, и аналогично, когда выбран месяц, только соответствующие даты этому конкретному выбранному месяцу должен отображаться.

Ответ службы выглядит примерно так:

[ 
   { 
      "availableDate":"03/13/2020"
   },
   { 
      "availableDate":"04/14/2020"
   },
   { 
      "availableDate":"01/15/2020"
   },
   { 
      "availableDate":"01/16/2020"
   },
   { 
      "availableDate":"02/17/2020"
   },
   { 
      "availableDate":"02/18/2020"
   },
   { 
      "availableDate":"02/22/2021"
   }
]

Мне удалось разделить даты, месяцы и годы, и когда я попытался изменить значения с помощью onChange, не сделал получить желаемый результат. Может кто-нибудь, пожалуйста, помогите мне с логикой c или, может быть, дайте мне ссылку, чтобы начать?

1 Ответ

0 голосов
/ 24 февраля 2020

Я нашел решение.

Сначала инициализируем переменные:

  List _serviceData = [];
  List _yearList = [];
  List _monthList = [];
  List _dateList = [];
  List<SchedulerYear> _yearData = new List<SchedulerYear>();
  List<SchedulerMonth> _monthData = new List<SchedulerMonth>();
  List<SchedulerDate> _dateData = new List<SchedulerDate>();
  var yearData = [];
  var monthData = [];
  var _loadData, _year, _month, _date;

Используемые модели:

class SchedulerYear {
  String year;
  String month;
  String date;
  SchedulerYear({this.year,this.month,this.date});
  @override
  String toString() {
    return '$year $month $date';
  }
}

class SchedulerMonth {
  String month;
  String date;
  SchedulerMonth({this.month,this.date});
  @override
  String toString() {
    return '$month $date';
  }
}

class SchedulerDate {
  String date;
  SchedulerDate({this.date});
  @override
  String toString() {
    return '$date';
  }
}

И, наконец, функции:

 List<DropdownMenuItem<String>> getMenuItems(List options) {
    List<DropdownMenuItem<String>> items = List();
    for (String n in options) {
      items.add(DropdownMenuItem(value: n, child: Text(n)));
    }
    return items;
  }

 _getYears() async {
    _serviceData = await serviceHandler.fadfj;  // the service response as a List
    _yearData = [];
    _yearList = [];
    _yearItems = [];
    for (int i = 0; i < _serviceData.length; i++) {
      _loadData = _serviceData[i].toString();
      _month = _loadData.split('/')[0];
      _date = _loadData.split('/')[1];
      _year = _loadData.split('/')[2];
      _yearData.add(SchedulerYear(year: _year, month: _month, date: _date));
      _yearList.add(_year);
    }
    _yearList = _yearList.toSet().toList();
    _yearItems = getMenuItems(_yearList);
    _selectedYear = _yearItems[0].value;
    yearData = _yearData;
  }

  _getMonths(selectedYear) {
    _dateItems = [];
    _dateItems = getMenuItems(_initialDate);
    _selectedDate = _dateItems[0].value;
    _yearData = yearData;
    _monthData = [];
    _monthList = [];
    _monthItems = [];
    for (int i = 0; i < _yearData.length; i++) {
      if (_yearData[i].year == selectedYear) {
        _monthData.add(SchedulerMonth(month: _yearData[i].month, date: _yearData[i].date));
        _monthList.add(_yearData[i].month);
      }
    }
    monthData = _monthData;
    _monthList = _monthList.toSet().toList();
    _monthItems = getMenuItems(_monthList);
    _selectedMonth = _monthItems[0].value;
  }

  _getDates(selectedMonth) {
    _monthData = monthData;
    _dateData = [];
    _dateList = [];
    _dateItems = [];
    for (int i = 0; i < _monthData.length; i++) {
      if (_monthData[i].month == selectedMonth) {
        _dateData.add(SchedulerDate(date: _monthData[i].date));
        _dateList.add(_monthData[i].date);
      }
    }
    _dateList = _dateList.toSet().toList();
    _dateItems = getMenuItems(_dateList);
    _selectedDate = _dateItems[0].value;
  }

_getYears () вызывается внутри init (), а _getMonths (selectedYear) вызывается из раскрывающейся кнопки onChange of year и _getDates (selectedMonth) для раскрывающейся кнопки месяцев

...