diff --git a/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/navigation/DetailStreamNavigation.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/navigation/DetailStreamNavigation.kt index 7917c3f3..172d5752 100644 --- a/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/navigation/DetailStreamNavigation.kt +++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/navigation/DetailStreamNavigation.kt @@ -1,6 +1,5 @@ package com.codandotv.streamplayerapp.feature_detail.presentation.navigation -import androidx.lifecycle.Lifecycle import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.compose.composable @@ -10,16 +9,18 @@ import com.codandotv.streamplayerapp.core_navigation.routes.Routes.PARAM.ID import com.codandotv.streamplayerapp.feature_detail.di.DetailStreamModule import com.codandotv.streamplayerapp.feature_detail.presentation.screens.DetailStreamScreen import org.koin.androidx.compose.koinViewModel -import org.koin.core.context.loadKoinModules +import org.koin.compose.module.rememberKoinModules +import org.koin.core.annotation.KoinExperimentalAPI import org.koin.core.context.unloadKoinModules import org.koin.core.parameter.parametersOf internal const val DEFAULT_ID = "0" +@OptIn(KoinExperimentalAPI::class) fun NavGraphBuilder.detailStreamNavGraph(navController: NavHostController) { composable(DETAIL_COMPLETE) { nav -> - if (nav.lifecycle.currentState == Lifecycle.State.STARTED) { - loadKoinModules(DetailStreamModule.module) + rememberKoinModules { + listOf(DetailStreamModule.module) } DetailStreamScreen( viewModel = koinViewModel { @@ -29,9 +30,6 @@ fun NavGraphBuilder.detailStreamNavGraph(navController: NavHostController) { onNavigateSearchScreen = { navController.navigate(Routes.SEARCH) }, - disposable = { - unloadKoinModules(DetailStreamModule.module) - } ) } } diff --git a/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamsScreen.kt b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamsScreen.kt index 2ce51aec..2e32247c 100644 --- a/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamsScreen.kt +++ b/feature-detail/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_detail/presentation/screens/DetailStreamsScreen.kt @@ -21,14 +21,12 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.em @@ -54,23 +52,13 @@ import streamplayerapp_kmp.feature_detail.generated.resources.detail_watch_prima fun DetailStreamScreen( viewModel: DetailStreamViewModel = koinViewModel(), navController: NavController, - disposable: () -> Unit = {}, onNavigateSearchScreen: () -> Unit = {}, ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() - - val lifecycleOwner = LocalLifecycleOwner.current - LifecycleEventEffect(Lifecycle.Event.ON_START) { viewModel.loadDetail() } - DisposableEffect(lifecycleOwner) { - onDispose { - disposable.invoke() - } - } - when (uiState) { is DetailStreamsUIState.DetailStreamsLoadedUIState -> { SetupDetailScreen( diff --git a/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/navigation/ListStreamsNavigation.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/navigation/ListStreamsNavigation.kt index 633a92fd..cb3a5a83 100644 --- a/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/navigation/ListStreamsNavigation.kt +++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/navigation/ListStreamsNavigation.kt @@ -12,18 +12,24 @@ import com.codandotv.streamplayerapp.core_navigation.routes.Routes.DETAIL import com.codandotv.streamplayerapp.core_navigation.routes.Routes.PROFILE_PICKER import com.codandotv.streamplayerapp.feature_list_streams.list.di.ListStreamModule import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.screens.ListStreamsScreen +import org.koin.compose.module.rememberKoinModules +import org.koin.core.annotation.KoinExperimentalAPI import org.koin.core.context.loadKoinModules import org.koin.core.context.unloadKoinModules internal const val DEFAULT_ID = "" +@OptIn(KoinExperimentalAPI::class) fun NavGraphBuilder.listStreamsNavGraph(navController: NavHostController) { composable(HOME_COMPLETE) { nav -> BackHandler(true) {} - if (nav.lifecycle.currentState == Lifecycle.State.STARTED) { - loadKoinModules(ListStreamModule.module) + + rememberKoinModules { + listOf(ListStreamModule.module) } - ListStreamsScreen(navController = navController, + + ListStreamsScreen( + navController = navController, onNavigateDetailList = { id -> navController.navigate("${DETAIL}${id}") }, @@ -33,9 +39,6 @@ fun NavGraphBuilder.listStreamsNavGraph(navController: NavHostController) { onNavigateSearchScreen = { navController.navigate(Routes.SEARCH) }, - disposable = { - unloadKoinModules(ListStreamModule.module) - }, profilePicture = nav.arguments?.getString(PROFILE_ID) ?: DEFAULT_ID ) } diff --git a/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt index d7f847a2..dbbcf312 100644 --- a/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt +++ b/feature-list-streams/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt @@ -43,21 +43,13 @@ fun ListStreamsScreen( onNavigateDetailList: (String) -> Unit = {}, onNavigateProfilePicker: () -> Unit = {}, onNavigateSearchScreen: () -> Unit = {}, - disposable: () -> Unit = {}, profilePicture: String ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() - val lifecycleOwner = LocalLifecycleOwner.current val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState()) val baseScrollState = rememberScrollState() - DisposableEffect(lifecycleOwner) { - onDispose { - disposable.invoke() - } - } - Scaffold( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { diff --git a/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/navigation/ProfilePickerStreamNavigation.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/navigation/ProfilePickerStreamNavigation.kt index 8d42759a..eb885448 100644 --- a/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/navigation/ProfilePickerStreamNavigation.kt +++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/navigation/ProfilePickerStreamNavigation.kt @@ -1,6 +1,5 @@ package com.codandotv.streamplayerapp.profile.presentation.navigation -import androidx.lifecycle.Lifecycle import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.compose.composable @@ -9,20 +8,19 @@ import com.codandotv.streamplayerapp.core_navigation.routes.BottomNavRoutes.PARA import com.codandotv.streamplayerapp.core_navigation.routes.Routes import com.codandotv.streamplayerapp.profile.di.ProfilePickerStreamModule import com.codandotv.streamplayerapp.profile.presentation.screens.ProfilePickerStreamScreen -import org.koin.core.context.loadKoinModules -import org.koin.core.context.unloadKoinModules +import org.koin.compose.module.rememberKoinModules +import org.koin.core.annotation.KoinExperimentalAPI +@OptIn(KoinExperimentalAPI::class) fun NavGraphBuilder.profilePickerStreamNavGraph(navController: NavHostController) { - composable(Routes.PROFILE_PICKER) { nav -> - if (nav.lifecycle.currentState == Lifecycle.State.STARTED) { - loadKoinModules(ProfilePickerStreamModule.module) + composable(Routes.PROFILE_PICKER) { + rememberKoinModules { + listOf(ProfilePickerStreamModule.module) } ProfilePickerStreamScreen( onNavigateListStreams = { profilePic -> navController.navigate("$HOME?$PROFILE_ID=$profilePic") } - ) { - unloadKoinModules(ProfilePickerStreamModule.module) - } + ) } } diff --git a/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamScreen.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamScreen.kt index a2e47d22..396526c5 100644 --- a/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamScreen.kt +++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamScreen.kt @@ -20,6 +20,8 @@ import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreview +import com.codandotv.streamplayerapp.core_shared_ui.theme.ThemePreviews import com.codandotv.streamplayerapp.feature.profile.R import com.codandotv.streamplayerapp.profile.domain.ProfileStream import com.codandotv.streamplayerapp.profile.presentation.widget.LoadScreen @@ -40,11 +42,8 @@ import streamplayerapp_kmp.feature_profile.generated.resources.profile_animation fun ProfilePickerStreamScreen( viewModel: ProfilePickerStreamViewModel = koinViewModel(), onNavigateListStreams: (String) -> Unit = {}, - disposable: () -> Unit = {} ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() - val lifecycleOwner = LocalLifecycleOwner.current - Lifecycle(lifecycleOwner, viewModel, disposable) if (uiState.isLoading) { LoadScreen() @@ -155,20 +154,4 @@ fun SetupProfilePickerScreen( } } ) -} - -@Composable -private fun Lifecycle( - lifecycleOwner: LifecycleOwner, viewModel: ProfilePickerStreamViewModel, disposable: () -> Unit -) { - DisposableEffect(lifecycleOwner) { - val lifecycle = lifecycleOwner.lifecycle - - lifecycle.addObserver(viewModel) - - onDispose { - lifecycle.removeObserver(viewModel) - disposable.invoke() - } - } -} +} \ No newline at end of file diff --git a/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamViewModel.kt b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamViewModel.kt index 75b5a2b6..1eac734f 100644 --- a/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamViewModel.kt +++ b/feature-profile/src/commonMain/kotlin/com/codandotv/streamplayerapp/profile/presentation/screens/ProfilePickerStreamViewModel.kt @@ -1,7 +1,5 @@ package com.codandotv.streamplayerapp.profile.presentation.screens -import androidx.lifecycle.DefaultLifecycleObserver -import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.codandotv.streamplayerapp.core_networking.handleError.catchFailure @@ -16,7 +14,7 @@ import kotlinx.coroutines.launch class ProfilePickerStreamViewModel( private val useCase: ProfilePickerStreamUseCase, -) : ViewModel(), DefaultLifecycleObserver { +) : ViewModel() { private val _uiState = MutableStateFlow(ProfilePickerStreamsUIState()) val uiState = _uiState.stateIn( @@ -25,9 +23,7 @@ class ProfilePickerStreamViewModel( initialValue = _uiState.value ) - override fun onCreate(owner: LifecycleOwner) { - super.onCreate(owner) - + init { viewModelScope.launch { useCase.getProfile() .catchFailure { diff --git a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/navigation/SearchStreamNavigation.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/navigation/SearchStreamNavigation.kt index ebcf0742..134ad7e5 100644 --- a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/navigation/SearchStreamNavigation.kt +++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/navigation/SearchStreamNavigation.kt @@ -8,22 +8,22 @@ import androidx.navigation.compose.composable import com.codandotv.streamplayerapp.core_navigation.routes.Routes import com.codandotv.streamplayerapp.feature_search.di.SearchModule import com.codandotv.streamplayerapp.feature_search.presentation.screens.SearchScreen +import org.koin.compose.module.rememberKoinModules +import org.koin.core.annotation.KoinExperimentalAPI import org.koin.core.context.loadKoinModules import org.koin.core.context.unloadKoinModules +@OptIn(KoinExperimentalAPI::class) fun NavGraphBuilder.searchStreamsNavGraph(navController: NavHostController) { - composable(Routes.SEARCH) { nav -> + composable(Routes.SEARCH) { _ -> BackHandler(true) {} - if (nav.lifecycle.currentState == Lifecycle.State.STARTED) { - loadKoinModules(SearchModule.module) + rememberKoinModules { + listOf(SearchModule.module) } SearchScreen( navController = navController, onNavigateDetailList = { id -> navController.navigate("${Routes.DETAIL}${id}") - }, - disposable = { - unloadKoinModules(SearchModule.module) } ) } diff --git a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchScreen.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchScreen.kt index 94ff555e..61b389c6 100644 --- a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchScreen.kt +++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchScreen.kt @@ -39,16 +39,9 @@ fun SearchScreen( viewModel: SearchViewModel = koinViewModel(), onNavigateDetailList: (String) -> Unit = {}, navController: NavController, - disposable: () -> Unit = {} ) { val uiState by viewModel.uiState.collectAsState() - Lifecycle( - lifecycleOwner = LocalLifecycleOwner.current, - viewModel = viewModel, - disposable = disposable - ) - when (uiState) { is SearchUIState.Success -> { SetupSearchScreen( @@ -152,20 +145,4 @@ private fun SetupSearchScreen( navController.goBack() } -} - -@Composable -private fun Lifecycle( - lifecycleOwner: LifecycleOwner, viewModel: SearchViewModel, disposable: () -> Unit -) { - DisposableEffect(lifecycleOwner) { - val lifecycle = lifecycleOwner.lifecycle - - lifecycle.addObserver(viewModel) - - onDispose { - lifecycle.removeObserver(viewModel) - disposable.invoke() - } - } -} +} \ No newline at end of file diff --git a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchViewModel.kt b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchViewModel.kt index f1d48fdd..8a4314b7 100644 --- a/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchViewModel.kt +++ b/feature-search/src/commonMain/kotlin/com/codandotv/streamplayerapp/feature_search/presentation/screens/SearchViewModel.kt @@ -1,6 +1,5 @@ package com.codandotv.streamplayerapp.feature_search.presentation.screens -import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.codandotv.streamplayerapp.core_networking.handleError.catchFailure @@ -18,7 +17,7 @@ import kotlinx.coroutines.launch class SearchViewModel( private val searchUseCase: SearchUseCase, private val mostPopularMoviesUseCase: MostPopularMoviesUseCase -) : ViewModel(), DefaultLifecycleObserver { +) : ViewModel() { private var tryAgain: () -> Unit = {}