"Arguments of a constant creation must be constant expressions" (Dart)
В этом коде:
class _MenuWidget extends StatelessWidget {
const _MenuWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
width: double.infinity,
child: const Column(children: [
_MenuWidgetRow(icon: Icons.computer),
_MenuWidgetRow(icon: Icons.computer),
_MenuWidgetRow(icon: Icons.computer),
_MenuWidgetRow(icon: Icons.computer),
],)
);
}
}
class _MenuWidgetRow extends StatelessWidget {
final IconData icon;
const _MenuWidgetRow({super.key, required this.icon});
@override
Widget build(BuildContext context) {
return const Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 10),
child: Row(
children: [
Icon(icon), // Ошибка тут
SizedBox(width: 15),
Expanded(child: Text('test')),
Icon(Icons.chevron_right),
],
),
);
}
}
Появляется ошибка:
Arguments of a constant creation must be constant expressions.
Try making the argument a valid constant, or use 'new' to call the
constructor.dartconst_with_non_constant_argument
С чем это связано? Подтолкните зелёного на путь решения :)
Ответы (1 шт):
Автор решения: MiT
→ Ссылка
В Dart const
используется для создания константных значений во время компиляции. Также мы можем делать константные конструкторы чтобы получить константный объект:
class Point {
// Константный конструктор
const Point(this.x, this.y);
final int x;
final int y;
}
const point = Point(1, 2); // является константой
final point = Point(1, getValue()); // не является константой
Ошибка Arguments of a constant creation must be constant expressions
появляется, когда вы пытаетесь использовать не константное значение при создании константного объекта.
const point = Point(1, getValue()); // Ошибка
Преимущества использования const:
- Оптимизация производительности
- Гарантия неизменяемости
- Единственный экземпляр в памяти для идентичных констант
Правильный код:
class _MenuWidget extends StatelessWidget {
const _MenuWidget();
@override
Widget build(BuildContext context) {
return Container(
color: Colors.white,
width: double.infinity,
child: const Column(children: [
_MenuWidgetRow(icon: Icons.computer),
_MenuWidgetRow(icon: Icons.computer),
_MenuWidgetRow(icon: Icons.computer),
_MenuWidgetRow(icon: Icons.computer),
],)
);
}
}
class _MenuWidgetRow extends StatelessWidget {
final IconData icon;
const _MenuWidgetRow({required this.icon});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
child: Row(
children: [
Icon(icon), // Ошибки тут больше нет
SizedBox(width: 15),
Expanded(child: Text('test')),
Icon(Icons.chevron_right),
],
),
);
}
}