Как пометить типы из чужой библиотеки как стабильные в Jetpack Compose без редактирования кода
Что проверяют
Понимаете ли вы, как компилятор Compose решает, можно ли пропустить рекомпозицию, и знаете ли штатный способ повлиять на это для чужих классов. Следом обычно спрашивают, что изменил strong skipping и чем опасно объявить стабильным изменяемый тип.
Как отвечать
Классы из модулей, скомпилированных без плагина Compose (модели сторонней SDK, общий модуль на чистом Kotlin), компилятор считает нестабильными: проверить неизменяемость их полей он не может. Аннотацию на чужой код не повесить, поэтому штатное решение это файл конфигурации стабильности:
// stability_config.conf
com.example.sdk.model.Money
com.example.network.model.**
com.example.Wrapper<*,_>Одна строка это полное имя класса. * захватывает пакет, ** пакет со всеми подпакетами, а в дженериках * значит «стабильность зависит от этого параметра», _ значит «параметр не учитывать». Файл подключают в Gradle через плагин компилятора Compose:
composeCompiler {
stabilityConfigurationFiles.add(
rootProject.layout.projectDirectory.file("stability_config.conf")
)
}Что ещё назвать:
- область действия: файл влияет только на модули, где он подключён, поэтому его прописывают в общем convention-плагине;
- проверка: включите
reportsDestinationи посмотрите в отчётах*-classes.txtи*-composables.txt, стал ли классstable, а функцияskippable; - strong skipping: с Kotlin 2.0.20 режим включён по умолчанию, и функции с нестабильными параметрами тоже пропускаются, но такие параметры сравниваются по ссылке, а стабильные через
equals. Конфиг всё равно полезен: новый экземпляр с теми же данными перестаёт вызывать лишнюю рекомпозицию; - альтернатива: своя UI-модель с
@Immutable, в которую чужой тип маппится на границе слоя.
Где спотыкаются
Объявляют стабильным то, что меняется изнутри. Компилятор верит на слово, функция пропускается, и экран перестаёт обновляться.
Пишут обёртку вокруг каждого чужого класса, хотя хватает одной строки в конфиге.
Не открывают отчёты компилятора и считают, что всё заработало, раз сборка прошла.