Код: Выделить всё
data class UiState(
val showFavoriteBlock: Boolean,
val showRecentlyVisitedBlock: Boolean,
val showMostPopularBlock: Boolean,
val showSubscriptionBlock: Boolean,
val showFriendsBlock: Boolean,
val showRelatedBlock: Boolean,
val showLatestVisitedBlock: Boolean,
// There is 10+ same flags
// And here I have content for each block which starts loading after we receive flag
val favorites: Flow[*]>,
// 10+ flows for each block
)
< /code>
Прямо сейчас у меня есть следующий код для корневой композиционной функции < /p>
@Composable
fun ExampleScreen(uiState: UiState){
// We don't show screen untill all flags will be received,
// flags itself are simple Booleans. But content for them is flow
LazyColumn {
// reading flag's value doesn't force recomposition
// because it's not State and can't be changed
if(uiState.showFavoriteBlock){
item{
// we sending flow, so updates in flow right now
// cannot force recomposition of screen
FavoritesBlock(uiState.favorites)
}
}
// 10+ items for each block
...
}
}
< /code>
И вот мой недавновизированный Block Composable: < /p>
@Composable
fun RecentlyVisitedBlock(recentlyVisitedFlow: Flow) {
// recentlyVisited is State
val recentlyVisited by recentlyVisitedFlow.collectAsStateWithLifecycle()
Row {
// Here I'm reading state and this causes recomposition for all RecentlyVisitedBlock
// So recomposition happens only when we receive new data from flow
}
}
< /code>
Как видите, я собираю более 10 потоков в композиционных функциях. И ... это нормально?
Все примеры в CodeLabs, JetPack Compose Примеры и учебные пособия содержит около 3-4 потоков. Но реальные приложения могут иметь около 20-30 (или даже больше) потоков, которые часто могут выделять данные. Можно работать с потоками в фоновом режиме, но здесь я собираю их все на UI. Может ли это привести к проблемам с производительностью? Поскольку основной поток должен обрабатывать все из них
[*] Я могу объединить все потоки в одном внутри UISTATE, а затем использовать FilterisInstance
Что если я изменю свой экран на примеры (Uistate: Flow ) . В этом случае у меня есть только 1 поток с одним вызовом CollectAsstateWithLifeCycle , но это приведет к переработке корня при каждом изменении. Кроме того, я могу использовать ReviveStateOF и пропустить переоценки некоторых детей. Что лучше: есть несколько потоков, которые собирают и начнут состояние чтения независимо или имеют 1 поток, который вызывает переоборудование корня в каждом обновлении? Во втором случае
вам понадобится одно состояние для каждого значения (например: электронная почта, пароль,
загрузка, ошибка и т. Д.). Проблема заключается в том, что в вашем ViewModel и ваших композиционных продуктах будет много состояний
. С другой стороны, вторая параметр
лучше подходит для обработки переоборудования. Uistate (https://developer.android.com/jetpack/c ... n-ui-state), который излучает класс данных с 50+ полками, которые пересказывают весь экран или 2) Индивидуальные поля с меньшими откомплектованием.
Подробнее здесь: https://stackoverflow.com/questions/765 ... ck-compose