Что такое фаза layout в Jetpack Compose
Что проверяют
Знаете ли вы, что кадр в Compose проходит три фазы, и понимаете ли, что делает layout. Отсюда растёт весь разговор про производительность: что именно перезапускается при изменении состояния и почему рекомпозиция это не единственная цена.
Как отвечать
Фаз три: композиция решает, какие узлы вообще есть в дереве, layout решает, какого они размера и где стоят, отрисовка рисует. Внутри layout два шага: узел измеряет детей в переданных ему ограничениях и выбирает собственный размер, а потом расставляет детей по координатам.
Ключевое свойство: ребёнка разрешено измерять один раз за проход. Многократный прогон измерения, привычный по старой системе вью, здесь невозможен, поэтому дерево укладывается за один обход. Исключения это встроенные размеры и SubcomposeLayout, оба заметно дороже.
Практический вывод про оптимизацию: если значение нужно только для положения, читайте его в лямбде модификатора.
Box(Modifier.offset { IntOffset(offsetX.value, 0) })Такая запись при прокрутке перезапускает только layout и отрисовку, тогда как вариант с передачей готового значения аргументом утащит за собой и рекомпозицию всего блока.
Где спотыкаются
Называют измерение отдельной фазой и получают четыре штуки вместо трёх. Измерение и размещение это два шага одной фазы, и формулировку ждут именно такую.
Считают порядок модификаторов косметикой. Каждый модификатор оборачивает следующий, ограничения идут по цепочке сверху вниз, поэтому отступ до размера и после размера дают разный результат.
Оптимизируют одну рекомпозицию. Анимация размера или частая смена отступов композицию не трогают вовсе, но перезапускают layout всему поддереву, и в профиле видно именно это.