Как используются неизменяемые (Immutable) объекты в Dart?

«Как используются неизменяемые (Immutable) объекты в Dart?» — вопрос из категории Dart Core, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Неизменяемые объекты — это объекты, состояние которых нельзя изменить после создания. В Dart это достигается комбинацией final полей и const конструкторов. Они критически важны для Flutter-виджетов.

Базовый пример неизменяемого класса:

class ImmutablePoint {
  final int x;
  final int y;

  const ImmutablePoint(this.x, this.y);
}

Почему это важно во Flutter?

  1. Производительность: Flutter часто перестраивает виджеты. const конструктор позволяет Flutter переиспользовать один экземпляр виджета в памяти, вместо создания нового.
  2. Предсказуемость: Гарантия, что данные виджета не изменятся во время его жизни, упрощает отладку и предотвращает трудноуловимые баги.

Практическое применение в виджетах:

class MyTitle extends StatelessWidget {
  final String text; // final поле

  const MyTitle({Key? key, required this.text}) : super(key: key); // const конструктор

  @override
  Widget build(BuildContext context) {
    return Text(text);
  }
}

// Использование с const - виджет будет создан один раз и закэширован.
const MyTitle(text: 'Hello');

Ключевые преимущества:

  • Thread-safe: Безопасны в асинхронных операциях, так как состояние не меняется.
  • Кэширование: Объекты, созданные через const, кэшируются во время компиляции и выполнения (identical() возвращает true для одинаковых значений).
  • Оптимизация: Позволяют Flutter пропускать перерисовку поддеревьев, если все дочерние виджеты также const.