Jetpack Compose:通过按钮关闭应用程序

Jetpack Compose: close application by button

NavController 无法以编程方式弹出堆栈中最新的@Composable。 IE。如果它是根页面,则 popBackStack() 不起作用。因此,可以通过点击“关闭”按钮视图来关闭应用程序,并且只有硬件后退键允许离开应用程序。

示例: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")
    }
}

问题:

如果使用 Compose Navigation,如何在 onClick 处理程序中关闭应用程序。

你可以使用这个:

@Composable
fun HomePage(controller: NavController) {
    val activity = (LocalContext.current as? Activity)
    Button(onClick = {
        activity?.finish()
    }) {
        Text("Exit")
    }
}
@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")
        }
    }
}