Иногда — враг
Вместе с Sound null safety в 2021 году появилось новое ключевое слово
late. Что такое late
Согласно документации, его можно использовать для двух случаев:
1️⃣ Декларирование non-nullable переменной, которая обязательно (помните об этом ⚠️) должна быть инициализирована позже.
2️⃣ Ленивая, или lazy-инициализация переменных: она происходит только при первом обращении.
Немного подробнее про использовании late для lazy-инициализации
Lazy-инициализацию используют по двум причинам:
🔹 Когда нужен доступ к
this для инициализации объекта. Например, для создания AnimationController нам нужно передать this в параметр vsync, т. к. контроллеру нужен TickerProvider. В этом случае мы вынуждены будем использовать late: по-другому никак.🔹 Когда хотим оптимизировать ресурсы устройства через инициализацию только действительно нужных объектов. В этом случае использовать
late необязательно, но очень желательно — а иногда даже необходимо. Правда, тут есть нюансы. Подробнее на картинках 👆👆👆
➡️ Давайте представим: вы создаёте стрим и хотите сразу создать слушателя к нему.
Вроде бы все правильно и «по-взрослому», но… вы ничего не услышите 👂— переменная
sub так и останется «late», она по-прежнему не инициализирована.➡️ Чтобы исключить такую ситуацию, нужно определить подписку так, как на третьей картинке.
Well done! В таком виде всё будет работать. Хорошей практикой ещё будет сделать
controller и sub приватными, если это возможно, но это уже тонкости.👉 Живой пример на DartPad


