Late нам друг или враг? ⚠️
Иногда — враг
Вместе с 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