fix potential recompositions

This commit is contained in:
2024-08-04 04:53:00 +03:00
parent c829a7f96a
commit 19fa2c79a8
7 changed files with 10 additions and 13 deletions
@@ -1,5 +1,8 @@
package dev.meloda.fast.model package dev.meloda.fast.model
import androidx.compose.runtime.Immutable
@Immutable
data class BottomNavigationItem( data class BottomNavigationItem(
val titleResId: Int, val titleResId: Int,
val selectedIconResId: Int, val selectedIconResId: Int,
@@ -8,6 +8,7 @@ import dev.meloda.fast.model.BaseError
import dev.meloda.fast.model.BottomNavigationItem import dev.meloda.fast.model.BottomNavigationItem
import dev.meloda.fast.presentation.MainScreen import dev.meloda.fast.presentation.MainScreen
import dev.meloda.fast.profile.navigation.Profile import dev.meloda.fast.profile.navigation.Profile
import dev.meloda.fast.ui.util.ImmutableList
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import dev.meloda.fast.ui.R as UiR import dev.meloda.fast.ui.R as UiR
@@ -23,7 +24,7 @@ fun NavGraphBuilder.mainScreen(
onConversationClicked: (conversationId: Int) -> Unit, onConversationClicked: (conversationId: Int) -> Unit,
onPhotoClicked: (url: String) -> Unit onPhotoClicked: (url: String) -> Unit
) { ) {
val navigationItems = listOf( val navigationItems = ImmutableList.of(
BottomNavigationItem( BottomNavigationItem(
titleResId = UiR.string.title_friends, titleResId = UiR.string.title_friends,
selectedIconResId = UiR.drawable.baseline_people_alt_24, selectedIconResId = UiR.drawable.baseline_people_alt_24,
@@ -38,11 +38,12 @@ import dev.meloda.fast.profile.navigation.profileScreen
import dev.meloda.fast.ui.theme.LocalBottomPadding import dev.meloda.fast.ui.theme.LocalBottomPadding
import dev.meloda.fast.ui.theme.LocalHazeState import dev.meloda.fast.ui.theme.LocalHazeState
import dev.meloda.fast.ui.theme.LocalThemeConfig import dev.meloda.fast.ui.theme.LocalThemeConfig
import dev.meloda.fast.ui.util.ImmutableList
@OptIn(ExperimentalHazeMaterialsApi::class) @OptIn(ExperimentalHazeMaterialsApi::class)
@Composable @Composable
fun MainScreen( fun MainScreen(
navigationItems: List<BottomNavigationItem>, navigationItems: ImmutableList<BottomNavigationItem>,
onError: (BaseError) -> Unit = {}, onError: (BaseError) -> Unit = {},
onSettingsButtonClicked: () -> Unit = {}, onSettingsButtonClicked: () -> Unit = {},
onConversationItemClicked: (conversationId: Int) -> Unit = {}, onConversationItemClicked: (conversationId: Int) -> Unit = {},
@@ -21,7 +21,6 @@ import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import dev.meloda.fast.MainViewModel import dev.meloda.fast.MainViewModel
import dev.meloda.fast.MainViewModelImpl
import dev.meloda.fast.auth.authNavGraph import dev.meloda.fast.auth.authNavGraph
import dev.meloda.fast.auth.navigateToAuth import dev.meloda.fast.auth.navigateToAuth
import dev.meloda.fast.chatmaterials.navigation.chatMaterialsScreen import dev.meloda.fast.chatmaterials.navigation.chatMaterialsScreen
@@ -37,12 +36,11 @@ import dev.meloda.fast.photoviewer.navigation.photoViewScreen
import dev.meloda.fast.settings.navigation.navigateToSettings import dev.meloda.fast.settings.navigation.navigateToSettings
import dev.meloda.fast.settings.navigation.settingsScreen import dev.meloda.fast.settings.navigation.settingsScreen
import dev.meloda.fast.ui.R import dev.meloda.fast.ui.R
import org.koin.androidx.compose.koinViewModel
@Composable @Composable
fun RootScreen( fun RootScreen(
navController: NavHostController = rememberNavController(), navController: NavHostController = rememberNavController(),
viewModel: MainViewModel = koinViewModel<MainViewModelImpl>() viewModel: MainViewModel
) { ) {
val context = LocalContext.current val context = LocalContext.current
val startDestination by viewModel.startDestination.collectAsStateWithLifecycle() val startDestination by viewModel.startDestination.collectAsStateWithLifecycle()
@@ -7,10 +7,7 @@ class ImmutableList<T>(val values: List<T>) : Iterable<T> {
constructor(size: Int, init: (index: Int) -> T) : this(MutableList(size, init)) constructor(size: Int, init: (index: Int) -> T) : this(MutableList(size, init))
operator fun get(index: Int): T? { operator fun get(index: Int): T = values[index]
values.singleOrNull()
return values[index]
}
inline fun forEach(action: (T) -> Unit) { inline fun forEach(action: (T) -> Unit) {
for (element in values) action(element) for (element in values) action(element)
@@ -10,6 +10,5 @@ import org.koin.dsl.module
val conversationsModule = module { val conversationsModule = module {
singleOf(::ConversationsUseCaseImpl) bind ConversationsUseCase::class singleOf(::ConversationsUseCaseImpl) bind ConversationsUseCase::class
viewModelOf(::ConversationsViewModelImpl) viewModelOf(::ConversationsViewModelImpl)
} }
@@ -71,7 +71,6 @@ import dev.chrisbanes.haze.hazeChild
import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi
import dev.chrisbanes.haze.materials.HazeMaterials import dev.chrisbanes.haze.materials.HazeMaterials
import dev.meloda.fast.conversations.ConversationsViewModel import dev.meloda.fast.conversations.ConversationsViewModel
import dev.meloda.fast.conversations.ConversationsViewModelImpl
import dev.meloda.fast.conversations.model.ConversationOption import dev.meloda.fast.conversations.model.ConversationOption
import dev.meloda.fast.conversations.model.ConversationsScreenState import dev.meloda.fast.conversations.model.ConversationsScreenState
import dev.meloda.fast.conversations.model.UiConversation import dev.meloda.fast.conversations.model.UiConversation
@@ -85,7 +84,6 @@ import dev.meloda.fast.ui.theme.LocalHazeState
import dev.meloda.fast.ui.theme.LocalThemeConfig import dev.meloda.fast.ui.theme.LocalThemeConfig
import dev.meloda.fast.ui.util.isScrollingUp import dev.meloda.fast.ui.util.isScrollingUp
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.androidx.compose.koinViewModel
import org.koin.compose.koinInject import org.koin.compose.koinInject
import dev.meloda.fast.ui.R as UiR import dev.meloda.fast.ui.R as UiR
@@ -94,7 +92,7 @@ fun ConversationsRoute(
onError: (BaseError) -> Unit, onError: (BaseError) -> Unit,
onConversationItemClicked: (conversationId: Int) -> Unit, onConversationItemClicked: (conversationId: Int) -> Unit,
onPhotoClicked: (url: String) -> Unit, onPhotoClicked: (url: String) -> Unit,
viewModel: ConversationsViewModel = koinViewModel<ConversationsViewModelImpl>() viewModel: ConversationsViewModel
) { ) {
val context = LocalContext.current val context = LocalContext.current