#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
.