Является ли лист строк стабильным типом в Jetpack Compose
Что проверяют
Знаете ли вы, как компилятор Compose решает, можно ли пропустить рекомпозицию, и понимаете ли, что стабильность это свойство типа, а не содержимого. Вопрос практический: именно на коллекциях в параметрах чаще всего и теряется пропуск.
Как отвечать
Нет, List<String> нестабилен. Сам String стабилен, а вот kotlin.collections.List это интерфейс, и компилятор не может доказать, что за ним не стоит изменяемая реализация, которую правят в обход снапшотов. Раз изменение нельзя отследить, тип помечается нестабильным.
Последствие одно и оно про производительность: композабл с нестабильным параметром не попадает в пропуск и выполняется заново при каждой рекомпозиции родителя, даже когда список тот же самый. На корректность это не влияет.
Что с этим делают:
ImmutableListилиpersistentListOfиз kotlinx.collections.immutable, эти типы объявлены стабильными;- своя обёртка с аннотацией
@Immutableили@Stable, если гарантию вы даёте сами; - файл конфигурации стабильности для чужих типов, которые править нельзя;
mutableStateListOf, если список это именно состояние экрана:SnapshotStateListнаблюдаем и меняется прямо в композиции.
В современных версиях компилятора работает режим сильного пропуска: композабл с нестабильными параметрами всё равно может пропускаться, такие параметры сравниваются по ссылке. Остроту это снимает, но вопрос не отменяет: новый список на каждом рендере даст новую ссылку.
Где спотыкаются
Отвечают «список изменяемый, поэтому нестабилен» и не различают List и MutableList. Нестабилен и неизменяемый по контракту List, потому что гарантию даёт не тип, а дисциплина вызывающего.
Путают пропуск рекомпозиции с переиспользованием элементов в LazyColumn. Ленивый список и так создаёт только видимые элементы, а key нужен для сохранения состояния при перестановках, к стабильности типов это отношения не имеет.
Спорят о стабильности на глаз вместо того, чтобы включить отчёты компилятора. Они выписывают по каждому композаблу, пропускаемый он или нет, и по каждому параметру, стабилен ли его тип, после чего спор заканчивается.