что-то начальное
var someval by remember {mutableStateOf("initial val")}
// альтернативы
val somevalFlow = remember(someval) { flowOf(someval) }
val somevalFlow2 by derivedStateOf { flowOf(someval) }
val somevalFlow3 by remember { derivedStateOf { flowOf(someval) } }
Хотелось бы понять чем они отличаются с точки зрения эффективности/поведения. И в частности надо ли заворачивать derivedStateOf в remember?
>И в частности надо ли заворачивать derivedStateOf в remember? во всех примерах из документации что я видел он всегда заворачивается в remember кроме случаев когда создание derivedState происходит вне композиции (например во вьюмодели или state классе)
Немного в сторону - А в чём смысл создавать derivedStateOf во вьюмодели? Откуда он узнает что стейт от которого он произошёл поменялся - это же, я так понимаю, ответственность композиции (как процесса), т.е. если я его не задействовал нигде внутри композабл функции потом он обновляться и не будет, так? Я тоже могу найти примеры использования всего этого в разных видах :) но это не объясняет почему и как...
внутри State/MutableState/etc используется механизм снапшотов который и уведомляет всю систему об изменениях в том числе и derivedState, оно работает без композиции. Там недавно книжка вышла где про это очень детально рассказывается.
Можно название книжечки?
Да эту книжку я видал :) Но это был сторонний вопрос - оно работает без композиции это понятно и хорошо. Но возвращаясь к первому сообщению... Между вторым и третьим вариантами надо предпочитать третий (чтобы на каждый фрейм не создавать экземпляр derived state) а что насчёт первого? Будет его поведение в некотором смысле идентично третьему варианту и если да что всё-таки лучше?
мне кажется, flow не нужно заворачивать в derivedStateOf так как это не StateObject (который из композа и от которого наследуются все стейты в композе), следовательно derivedState не будет ничего знать о flow. Не уверен насчёт заворачивания flow в remember, я обычно тупо вызываю LaunchedEffect(key1 = Unit, block = { flow.collect { ... })
Так и знал что flow привлечёт ненужное внимание. :) Вопрос не про flow, пусть там будет любое другое преобразование начального значения - как тогда?
Обсуждают сегодня