fix: pop backstack crash in certain scenarios

This commit is contained in:
Zane Schepke
2025-12-25 01:18:06 -05:00
parent 679f6abbcb
commit c16a1b9b55
3 changed files with 16 additions and 12 deletions
@@ -55,7 +55,6 @@ import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation3.runtime.NavKey
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
@@ -185,10 +184,12 @@ class MainActivity : AppCompatActivity() {
var previousRoute by remember { mutableStateOf<Route?>(null) }
val navController =
rememberNavController<NavKey>(backStack, uiState.isLocationDisclosureShown) {
previousKey ->
previousRoute = previousKey as? Route
}
rememberNavController(
backStack,
uiState.isLocationDisclosureShown,
onChange = { previousKey -> previousRoute = previousKey as? Route },
onExitApp = { finish() },
)
val vpnActivity =
rememberLauncherForActivityResult(
@@ -7,6 +7,7 @@ class NavController(
private val backStack: NavBackStack<NavKey>,
private val isDisclosureShown: Boolean,
private val onChange: (previous: NavKey?) -> Unit = {},
private val onExitApp: () -> Unit = {},
) {
fun push(route: NavKey) {
onChange(currentRoute)
@@ -14,12 +15,13 @@ class NavController(
}
fun pop(): Boolean {
if (currentRoute != null) {
onChange(currentRoute)
backStack.removeLastOrNull()
if (!canPop) {
onExitApp()
return true
}
return false
onChange(currentRoute)
backStack.removeLastOrNull()
return true
}
fun popUpTo(route: NavKey) {
@@ -7,12 +7,13 @@ import androidx.navigation3.runtime.NavKey
import com.zaneschepke.wireguardautotunnel.ui.navigation.NavController
@Composable
fun <T : NavKey> rememberNavController(
fun rememberNavController(
backStack: NavBackStack<NavKey>,
isDisclosureShown: Boolean,
onChange: (NavKey?) -> Unit = {},
onExitApp: () -> Unit = {},
): NavController {
return remember(backStack, onChange, isDisclosureShown) {
NavController(backStack, isDisclosureShown, onChange)
return remember(backStack, isDisclosureShown, onChange, onExitApp) {
NavController(backStack, isDisclosureShown, onChange, onExitApp)
}
}