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

Ser*_*kov 23 kotlin android-jetpack-navigation android-jetpack-compose

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

示例:活动

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

主页.kt

@Composable
fun HomePage(controller: NavController) {
    Button(onClick = {
        controller.popBackStack()
    }) {
        Text("Exit")
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:

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

ngl*_*ber 68

你可以使用这个:

@Composable
fun HomePage(controller: NavController) {
    val activity = (LocalContext.current as? Activity)
    Button(onClick = {
        activity?.finish()
    }) {
        Text("Exit")
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在可组合项中获取活动并不是一个好主意。最好将事件向上传递到 ViewModel,在活动中订阅它,然后在那里调用 finish (14认同)
  • ..或者更好:调用 onClick = { onExitClick() } ,它作为 lambda 传递给函数 fun HomePage(onExitClick: () -> Unit) {} (5认同)
  • 经过几个月的生产,我可以说这个解决方案效果很好。谢谢。 (4认同)
  • 我同意你们的观点,传递 lambda 可能是一个更好的选择,当然这个解决方案只有在您遵循单一活动模型的情况下才有效。但是这里有一个诚实的问题:你们看到本地上下文的场景吗?不是一个活动? (2认同)