"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:

  1. Оптимизация производительности
  2. Гарантия неизменяемости
  3. Единственный экземпляр в памяти для идентичных констант

Правильный код:

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),
        ],
      ),
    );
  }
}
→ Ссылка