В Flutter иммутабельные объекты (например, виджеты) играют центральную роль в механизме перерисовки UI.
Ключевые аспекты использования:
- Эффективность перерисовки: Flutter может эффективно сравнивать виджеты в дереве элементов, поскольку их свойства не изменяются после создания. Если свойства родительского виджета не изменились, его дети, являющиеся иммутабельными виджетами, также не нуждаются в перерисовке, что оптимизирует производительность.
- Предсказуемость: Из-за неизменяемости свойств виджета его состояние всегда явно определено в момент создания. Это упрощает отладку и понимание потока данных в приложении.
- Потокобезопасность: Поскольку иммутабельные объекты не могут быть изменены, они inherently потокобезопасны. Это важно в асинхронной среде, где несколько потоков могут взаимодействовать с данными.
- Создание нового состояния: При изменении данных, вместо мутации существующего объекта, создается новый экземпляр виджета или объекта состояния с обновленными свойствами.
Пример создания иммутабельного виджета StatelessWidget:
dart
В StatefulWidget сам виджет является иммутабельным, но его связанный объект State является мутабельным и хранит изменяемое состояние. При изменении состояния в State, вызывается setState(), который уведомляет фреймворк о необходимости перестроить виджеты, используя новое состояние. Создается новый экземпляр виджета с обновленными свойствами, но старый виджет сравнивается с новым для определения минимальных изменений в дереве элементов.