diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 707ea2988..11f06aa9a 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -25,8 +25,10 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.rememberNavBackStack +import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator import androidx.navigation3.scene.SinglePaneSceneStrategy import androidx.navigation3.ui.NavDisplay import io.legado.app.BuildConfig @@ -236,12 +238,19 @@ open class MainActivity : BaseComposeActivity(), VariableDialog.Callback { LaunchedEffect(backStack) { snapshotFlow { backStack.toList() } - .collect { latestBackStack = it } + .collect { + latestBackStack = it + MainNavigator.onBackStackChanged() + } } SharedTransitionLayout { NavDisplay( backStack = backStack, + entryDecorators = listOf( + rememberSaveableStateHolderNavEntryDecorator(), + rememberViewModelStoreNavEntryDecorator(), + ), sceneStrategies = listOf(SinglePaneSceneStrategy()), transitionSpec = { (slideIntoContainer( diff --git a/app/src/main/java/io/legado/app/ui/main/MainNavigator.kt b/app/src/main/java/io/legado/app/ui/main/MainNavigator.kt index 641febb00..8292c959a 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainNavigator.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainNavigator.kt @@ -8,6 +8,8 @@ import io.legado.app.ui.rss.read.MainRouteRssRead object MainNavigator { + private var backNavigationInProgress = false + fun navigateToRoute(backStack: MutableList, route: NavKey) { val currentRoute = backStack.lastOrNull() if (currentRoute == route) return @@ -181,6 +183,10 @@ object MainNavigator { } fun navigateBack(activity: Activity, backStack: MutableList) { + if (backNavigationInProgress) { + return + } + backNavigationInProgress = true if (backStack.size > 1) { backStack.removeLastOrNull() } else { @@ -188,6 +194,10 @@ object MainNavigator { } } + fun onBackStackChanged() { + backNavigationInProgress = false + } + fun resolveStartRoute(intent: Intent?): NavKey { val route = intent?.getStringExtra(MainIntent.EXTRA_START_ROUTE) resolveRssStartRoute(route, intent)?.let { return it }