Передача индекса переменной виджету flutter

#flutter #dart

#flutter #dart

Вопрос:

Я новичок в flutter и пытаюсь создать представление, подобное календарю.

Я использую некоторую логику для генерации списка недель, отображаемого в виде строк, которые сами по себе являются списками дней (базовые виджеты).

Я столкнулся с препятствием, передающим простой индекс виджетам «Один день», чтобы отобразить номер дня.

Хотя я узнал, как передавать их самим виджетам через их конструктор: CalendarDay({this.monthDay}); , Dart продолжает жаловаться, что, поскольку они генерируются с помощью логики, значения индекса не являются константами.

Логика, которую я использую для генерации списка виджетов календарного дня:

     for(int rows =1,daysAdded=1; rows<=7;rows  ) {
      for(int y=1;y<=7;y  ){
        if(rows > 1 || y >= firstOfMonthWeekday){
          print("Adding day $daysAdded to week nr. $rows");
          final String str = daysAdded.toString();

          // This is where I try to pass the index to the CalendarDay Widget
          weeklyRow.add(new CalendarDay(monthDay: str)); 
          daysAdded  ;
          if(daysAdded>daysInThisMonth){
            done = true;
            break;
          }
        }
      }
      monthWeeksDays.add(weeklyRow);
      weeklyRow = [];
      print('Days in week $rows: ${monthWeeksDays[rows-1].length}');
      if(done)
        break;
    }
  

Сам виджет CalendarDay:

 class CalendarDay extends StatelessWidget {
  final String monthDay;
  CalendarDay({this.monthDay});

  @override
  Widget build(BuildContext context) {
    final double screenWidth = MediaQuery.of(context).size.width;
    return SizedBox(
      width: screenWidth/7,
      height: screenWidth/7,
      child: const DecoratedBox(
        decoration: BoxDecoration( color: Colors.blue),
        child: Center(
          child: Text(monthDay),
        ),
      ),
    );
  }
}
  

Я уже пытался преобразовать CalendarDay в StatefulWidget, чтобы посмотреть, позволило ли бы это мне использовать непостоянное значение, но все равно требовалось, чтобы значение было постоянным, даже когда я удалил ключевое слово final из объявления класса.

Помимо того, что я не уверен, как поступить без индексов, если кто-нибудь может просто указать мне способ решения проблемы, я, очевидно, готов изучить его сам. Спасибо.

Ответ №1:

Попробуйте добавить const прямо перед CalendarDay({this.monthDay}); :

 class CalendarDay extends StatelessWidget {
  final String monthDay;
  const CalendarDay({this.monthDay});

  @override
  Widget build(BuildContext context) {
    final double screenWidth = MediaQuery.of(context).size.width;
    return SizedBox(
      width: screenWidth/7,
      height: screenWidth/7,
      child: const DecoratedBox(
        decoration: BoxDecoration( color: Colors.blue),
        child: Center(
          child: Text(monthDay),
        ),
      ),
    );
  }
}
  

Комментарии:

1. Пробовал, все еще получаю эти две ошибки: — ошибка: Аргументы создания константы должны быть постоянными выражениями. (const_with_non_constant_argument в [fridge_app] lib /calendar.dart:17) — ошибка: вычисление этого постоянного выражения вызывает исключение. (исключение const_eval_throws_exception в [fridge_app] lib /calendar.dart:17)

2. Путем добавления new перед Text(monthDay), ошибки изменены на просто: error: Invalid constant value. (invalid_constant at [fridge_app] lib/calendar.dart:17).

Ответ №2:

Я идиот, я скопировал некоторый код для создания цветных полей в качестве заполнителя, и мне потребовалось несколько часов, чтобы заметить, что я объявляю DecoratedBox как const .