Przeglądaj źródła

fix: 修复全文搜索等界面多次点击返回导致退出上级界面

HapeLee 4 miesięcy temu
rodzic
commit
69c36fb795

+ 10 - 1
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.compose.runtime.snapshotFlow
 import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
 import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
 import androidx.lifecycle.lifecycleScope
 import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
 import androidx.navigation3.runtime.NavKey
 import androidx.navigation3.runtime.NavKey
 import androidx.navigation3.runtime.rememberNavBackStack
 import androidx.navigation3.runtime.rememberNavBackStack
+import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
 import androidx.navigation3.scene.SinglePaneSceneStrategy
 import androidx.navigation3.scene.SinglePaneSceneStrategy
 import androidx.navigation3.ui.NavDisplay
 import androidx.navigation3.ui.NavDisplay
 import io.legado.app.BuildConfig
 import io.legado.app.BuildConfig
@@ -236,12 +238,19 @@ open class MainActivity : BaseComposeActivity(), VariableDialog.Callback {
 
 
         LaunchedEffect(backStack) {
         LaunchedEffect(backStack) {
             snapshotFlow { backStack.toList() }
             snapshotFlow { backStack.toList() }
-                .collect { latestBackStack = it }
+                .collect {
+                    latestBackStack = it
+                    MainNavigator.onBackStackChanged()
+                }
         }
         }
 
 
         SharedTransitionLayout {
         SharedTransitionLayout {
             NavDisplay(
             NavDisplay(
                 backStack = backStack,
                 backStack = backStack,
+                entryDecorators = listOf(
+                    rememberSaveableStateHolderNavEntryDecorator(),
+                    rememberViewModelStoreNavEntryDecorator(),
+                ),
                 sceneStrategies = listOf(SinglePaneSceneStrategy()),
                 sceneStrategies = listOf(SinglePaneSceneStrategy()),
                 transitionSpec = {
                 transitionSpec = {
                     (slideIntoContainer(
                     (slideIntoContainer(

+ 10 - 0
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 {
 object MainNavigator {
 
 
+    private var backNavigationInProgress = false
+
     fun navigateToRoute(backStack: MutableList<NavKey>, route: NavKey) {
     fun navigateToRoute(backStack: MutableList<NavKey>, route: NavKey) {
         val currentRoute = backStack.lastOrNull()
         val currentRoute = backStack.lastOrNull()
         if (currentRoute == route) return
         if (currentRoute == route) return
@@ -181,6 +183,10 @@ object MainNavigator {
     }
     }
 
 
     fun navigateBack(activity: Activity, backStack: MutableList<NavKey>) {
     fun navigateBack(activity: Activity, backStack: MutableList<NavKey>) {
+        if (backNavigationInProgress) {
+            return
+        }
+        backNavigationInProgress = true
         if (backStack.size > 1) {
         if (backStack.size > 1) {
             backStack.removeLastOrNull()
             backStack.removeLastOrNull()
         } else {
         } else {
@@ -188,6 +194,10 @@ object MainNavigator {
         }
         }
     }
     }
 
 
+    fun onBackStackChanged() {
+        backNavigationInProgress = false
+    }
+
     fun resolveStartRoute(intent: Intent?): NavKey {
     fun resolveStartRoute(intent: Intent?): NavKey {
         val route = intent?.getStringExtra(MainIntent.EXTRA_START_ROUTE)
         val route = intent?.getStringExtra(MainIntent.EXTRA_START_ROUTE)
         resolveRssStartRoute(route, intent)?.let { return it }
         resolveRssStartRoute(route, intent)?.let { return it }