короче решил в итоге не получать вьюмодели/другие зависимости в параметрах композабл функции, а делать это в теле каждой функции. Таким образом теперь все параметры stable и функции restartable skippable.
так компоузу без разницы аргумент берет он из параметров или тела
Ну, судя по метрикам разница должна быть в момент рестарта композабл функции когда сравниваются аргументы чтобы решить рестартовать композабл функцию полностью или скипнуть. И типа если есть unstable аргументы то скипов не будет (как я понимаю). Но почему тогда функция помечена skippable? Может всё-таки возможны скипы даже с unstable аргументами? Я решил не гадать и тупо перенести все инжекты зависимостей в само тело функций (у меня вьюмодели не привязаны к композиции и живут дольше, остальные зависимости синглтоны). Хз может и не нужно, но где об этом написано?
мне кажется перенести всё в тело функции чтобы спрятать unstable парамы от компилятора не самая хорошая идея. на самом деле обычно я инжекчу вьюмодель именно в Route composable, а оттуда уже передаю всё что надо скрину. таким образом весь основной контент будет состоять из stable парамов, можно сказать. в их nowinandroid тоже так реализовано. примено вот так: @Composable internal fun HomeRoute(viewModel: HomeViewModel = hiltViewModel()) { val uiState by viewModel.uiState.collectAsState() HomeScreen( isLoading = uiState.isLoading ) } @Composable private fun HomeScreen(isLoading: Boolean) { ... }
ну они не меняются во время композиции, так как живут дольше, т.е. по-идее должно быть без разницы. Если бы у меня вьюмодели привязывались к композиции (как в гугловой навигации сделано вроде), то тогда да могли бы быть проблемы.
если не ошибаюсь, аргументами composable считаются и параметры, и данные внутри тела
Сделайте интерфейсы (пометьте их @Stable) и пусть вьюмодели эти интерфейсы реализуют. Тогда норм будет
ага, я тоже думал вьюмодели пометить как стейбл, но в итоге решил тупо инжектить их в теле функции, хз показалось менее костыльно лол
Обсуждают сегодня