jiechic
jiechic

Reputation: 91

Compose navigation lose state after pop screen (navigate for network success)

I am using compose navigation with single activity and no fragments.

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MobileComposePlaygroundTheme {
                Surface(color = MaterialTheme.colors.background) {
                    val navController = rememberNavController()
                    NavHost(navController, startDestination = "main") {
                        composable("main") { MainScreen(navController) }
                        composable("helloScreen/{data}") { HelloScreen() }
                    }
                }
            }
        }
    }
}

@Composable
private fun MainScreen(navController: NavHostController) {
    val viewModel = viewModel()
    val loginState by viewModel.loginState

    LaunchedEffect(loginState) {
        if(loginState is State.Success){
             navController.navigate("helloScreen/data")
        }
    }

    Column {
        Spacer(modifier = Modifier.height(16.dp))
        Button(
            onClick = { viewModel.login() },   //viewmodel will change loginState
            modifier = Modifier.padding(8.dp)
        ) {
            Text(text = "Go To HelloScreen")
        }
    }
}

@Composable
fun HelloScreen() {
    Log.d("TAG", "HelloScreen")
    Text("Hello Screen")
}

I have some problem

MainScreen(loginState)-> LaunchedEffect(loginState) -> HelloScreen -> back button -> MainScreen

when i pop HelloScreen

MainScreen will be recompose for

loginState, LaunchedEffect(netWorkState) will navigate(HelloScreen) again

how can i change code right of navigate

Upvotes: 3

Views: 1039

Answers (1)

Nikhil Dupally
Nikhil Dupally

Reputation: 963

Use Disposable effect

DisposableEffect(loginState) {
    if(loginState is State.Success){
         navController.navigate("helloScreen/data")
    }
  onDispose {
       loginState = State.Idle // Reset back your state here
    }
}

Upvotes: 4

Related Questions