У меня есть Gridview.builder
, который возвращает дни weekIndex
.
Мне нужно отобразить длину текущего месяца, чтобы показать только дни, связанные с этим месяцем, и я не знаю, что вставить в itemCount
.
Это мой код:
GridView.builder(
scrollDirection: Axis.vertical,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 7,
),
itemCount: 20,
itemBuilder:
(BuildContext context, int index) {
DateTime now = DateTime.now();
int milliseconds = now
.millisecondsSinceEpoch -
(now.weekday - 1) *
24 *
60 *
60 *
1000 +
index * 7 * 24 * 60 * 60 * 1000 +
index * 24 * 60 * 60 * 1000;
DateTime dayDateTime =
DateTime.fromMillisecondsSinceEpoch(
milliseconds);
int monthIndex = dayDateTime.month - 1;
List months = [
'Gen',
'Feb',
'Mar',
'Apr',
'Mag',
'Giu',
'Lug',
'Ago',
'Set',
'Ott',
'Nov',
'Dec'
];
List weekdays = WeekDays.days;
String month = months[monthIndex];
String day = dayDateTime.day.toString();
String weekday =
weekdays[dayDateTime.weekday - 1];
String date =
weekday + ' ' + day + ' ' + month;
String theDay = day + ' ' + weekday;
return GestureDetector(
onTap: () {
toggleIndex(index);
confirmed = true;
},
child: Card(
elevation: 5,
color: selectionIndexes.contains(index) ? Colors.purple: Colors.white,
shape: now.weekday ==
index + 1 &&
index == 0 ? RoundedRectangleBorder(
side: new BorderSide(
color: Colors.orange, width: 2.0),):RoundedRectangleBorder(
side: new BorderSide(
color: Colors.orange, width: 0),),
child: Container(
height: 40,
child: Center(
child: Text(
theDay,
style: TextStyle(
fontSize: 13,
color: selectionIndexes.contains(index)? Colors.white : Colors.black87)
),
),
),
),
);
},
),
На данный момент я жестко закодировал 20 как itemCount
, но мне нужно динамическое значение, чтобы показать реальную продолжительность текущего месяца.
Если я правильно понимаю ваш вопрос, вы хотите узнать количество дней в данном месяце?
DateTime today = DateTime.now();
DateTime monthEnd = DateTime(today.year, today.month + 1, 0); //This will give you last date of the month
int noOfDays = monthEnd.day;
Вероятно, есть более простое решение. Но это должно работать
Если вы посмотрите на api.flutter.dev/flutter/widgets/GridView/GridView.builder.html (документация), itemCount не является обязательным. Но это повышает производительность GridView. Если ваш GridView возвращает виджет GridView в день в течение месяца, используйте noOfDays выше.
вы не понимаете, посмотрите на картинку: ibb.co/zHVYfMm Как вы можете видеть ниже месяца, у меня есть GridView, которому нужно количество элементов, которое должно быть длиной текущего месяца.
Чтобы рассчитать количество оставшихся дней для текущего месяца, нам сначала нужно получить последний день месяца:
DateTime lastDayOfMonth = new DateTime(now.year, now.month + 1, 0);
А затем вычтите текущую дату:
DateTime lastDayOfMonth = new DateTime(now.year, now.month + 1, 0);
Duration difference = lastDayOfMonth.difference(now);
Чтобы получить int
, которое представляет количество дней, мы можем использовать свойство inDays
Duration
:
difference.inDays // int, the number of days
Таким образом, заворачивая в функцию:
int remainingDaysOfTheMonth() {
DateTime now = DateTime.now();
DateTime lastDayOfMonth = new DateTime(now.year, now.month + 1, 0);
Duration difference = lastDayOfMonth.difference(now);
return difference.inDays;
}
Вы можете использовать его, чтобы установить itemCount
в свой GridView
:
GridView.builder(
scrollDirection: Axis.vertical,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 7,
),
itemCount: remainingDaysOfTheMonth(),
itemBuilder:
(BuildContext context, int index) { }
)
подскажите тоже как найти такой же но на неделю?
Я бы рекомендовал опубликовать еще один вопрос с этим конкретным сценарием
хорошо, но что использовать в itemCount как длину?