Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jetpack Compose: close application by button

NavController can't pop programmatically the latest @Composable in the stack. I.e. popBackStack() doesn't work if it's a root page. So the application can be closed by tap on "Close" button view and only hardware Back key allows to leave application.

Example: Activity

class AppActivity : ComponentActivity() {
    override fun onCreate(state: Bundle?) {
        super.onCreate(state)
        setContent {
            val controller = rememberNavController()
            NavHost(controller, startDestination = HOME) {
                composable(HOME) { HomePage(controller) }
                ...
            }
        }
    }
}

HomePage.kt

@Composable
fun HomePage(controller: NavController) {
    Button(onClick = {
        controller.popBackStack()
    }) {
        Text("Exit")
    }
}

Question:

How to close the app in onClick handler if Compose Navigation is used.

like image 617
Sergey Krivenkov Avatar asked Sep 06 '25 14:09

Sergey Krivenkov


2 Answers

You can use this:

@Composable
fun HomePage(controller: NavController) {
    val activity = (LocalContext.current as? Activity)
    Button(onClick = {
        activity?.finish()
    }) {
        Text("Exit")
    }
}
like image 146
nglauber Avatar answered Sep 09 '25 05:09

nglauber


@AndroidEntryPoint
class MainActivity:AppCompatActivity() {

  @ExperimentalAnimatedInsets
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    WindowCompat.setDecorFitsSystemWindows(window, false)
    val activityKiller: () -> Unit = {
      this.finish()
    }

    setContent {
      MainAppEntry(activityKiller = activityKiller)
    }
  }
}

@Composable
fun MainAppEntry(activityKiller: () -> Unit) {
  val mainViewModel: MainViewModel = hiltViewModel<MainViewModel>()
  //mutableStateOf .......
  var isKillRequested = mainViewModel.mainActivityState.isActivityFinishRequested
  if (isKillRequested) {
    activityKiller()
    return
  }

  Column(Modifier.fillMaxSize()) {
    TextButton(onClick = {
      mainViewModel.smuaActivityState.requestActivityFinish()
    }) {
      Text(text = "Kill app")
    }
  }
}
like image 27
WAMii Avatar answered Sep 09 '25 03:09

WAMii