From 093936b036cabe045feeaaf31d65856dc23227ab Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Tue, 19 Mar 2024 14:15:04 +0100 Subject: [PATCH] Prevent screenModels being recreated when opening a screen from a tab Do it the right way, solution from https://github.com/adrielcafe/voyager/issues/266#issuecomment-2002108371 --- .../main/java/com/readrops/app/compose/MainActivity.kt | 10 ++++++---- .../com/readrops/app/compose/account/AccountTab.kt | 4 ++-- .../java/com/readrops/app/compose/feeds/FeedTab.kt | 7 ++----- .../com/readrops/app/compose/timelime/TimelineTab.kt | 4 ++-- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/appcompose/src/main/java/com/readrops/app/compose/MainActivity.kt b/appcompose/src/main/java/com/readrops/app/compose/MainActivity.kt index 2bcf35ef..0f2ef109 100644 --- a/appcompose/src/main/java/com/readrops/app/compose/MainActivity.kt +++ b/appcompose/src/main/java/com/readrops/app/compose/MainActivity.kt @@ -3,10 +3,9 @@ package com.readrops.app.compose import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.compose.animation.ExperimentalAnimationApi -import androidx.compose.material3.* import cafe.adriel.voyager.navigator.CurrentScreen import cafe.adriel.voyager.navigator.Navigator +import cafe.adriel.voyager.navigator.NavigatorDisposeBehavior import com.readrops.app.compose.account.selection.AccountSelectionScreen import com.readrops.app.compose.account.selection.AccountSelectionViewModel import com.readrops.app.compose.home.HomeScreen @@ -15,7 +14,6 @@ import org.koin.androidx.viewmodel.ext.android.getViewModel class MainActivity : ComponentActivity() { - @OptIn(ExperimentalAnimationApi::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -25,7 +23,11 @@ class MainActivity : ComponentActivity() { setContent { ReadropsTheme { Navigator( - screen = if (accountExists) HomeScreen() else AccountSelectionScreen() + screen = if (accountExists) HomeScreen() else AccountSelectionScreen(), + disposeBehavior = NavigatorDisposeBehavior( + // prevent screenModels being recreated when opening a screen from a tab + disposeNestedNavigators = false + ) ) { CurrentScreen() } diff --git a/appcompose/src/main/java/com/readrops/app/compose/account/AccountTab.kt b/appcompose/src/main/java/com/readrops/app/compose/account/AccountTab.kt index 9b964231..fea6e23c 100644 --- a/appcompose/src/main/java/com/readrops/app/compose/account/AccountTab.kt +++ b/appcompose/src/main/java/com/readrops/app/compose/account/AccountTab.kt @@ -28,7 +28,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import cafe.adriel.voyager.koin.getNavigatorScreenModel +import cafe.adriel.voyager.koin.getScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.tab.Tab @@ -56,7 +56,7 @@ object AccountTab : Tab { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow - val viewModel = navigator.getNavigatorScreenModel() + val viewModel = getScreenModel() val closeHome by viewModel.closeHome.collectAsStateWithLifecycle() val state by viewModel.accountState.collectAsStateWithLifecycle() diff --git a/appcompose/src/main/java/com/readrops/app/compose/feeds/FeedTab.kt b/appcompose/src/main/java/com/readrops/app/compose/feeds/FeedTab.kt index bb65d225..4ab4589b 100644 --- a/appcompose/src/main/java/com/readrops/app/compose/feeds/FeedTab.kt +++ b/appcompose/src/main/java/com/readrops/app/compose/feeds/FeedTab.kt @@ -30,9 +30,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import cafe.adriel.voyager.koin.getNavigatorScreenModel -import cafe.adriel.voyager.navigator.LocalNavigator -import cafe.adriel.voyager.navigator.currentOrThrow +import cafe.adriel.voyager.koin.getScreenModel import cafe.adriel.voyager.navigator.tab.Tab import cafe.adriel.voyager.navigator.tab.TabOptions import com.readrops.app.compose.R @@ -62,8 +60,7 @@ object FeedTab : Tab { val haptic = LocalHapticFeedback.current val uriHandler = LocalUriHandler.current - val navigator = LocalNavigator.currentOrThrow - val viewModel = navigator.getNavigatorScreenModel() + val viewModel = getScreenModel() val state by viewModel.feedsState.collectAsStateWithLifecycle() diff --git a/appcompose/src/main/java/com/readrops/app/compose/timelime/TimelineTab.kt b/appcompose/src/main/java/com/readrops/app/compose/timelime/TimelineTab.kt index ce237915..a80dc45b 100644 --- a/appcompose/src/main/java/com/readrops/app/compose/timelime/TimelineTab.kt +++ b/appcompose/src/main/java/com/readrops/app/compose/timelime/TimelineTab.kt @@ -39,7 +39,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems -import cafe.adriel.voyager.koin.getNavigatorScreenModel +import cafe.adriel.voyager.koin.getScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.tab.Tab @@ -69,7 +69,7 @@ object TimelineTab : Tab { val navigator = LocalNavigator.currentOrThrow val context = LocalContext.current - val viewModel = navigator.getNavigatorScreenModel() + val viewModel = getScreenModel() val state by viewModel.timelineState.collectAsStateWithLifecycle() val items = state.itemState.collectAsLazyPagingItems()