android 使用合成导航启动活动

omvjsjqw  于 2022-12-28  发布在  Android
关注(0)|答案(1)|浏览(146)

我尝试通过单击BottomNavBar上的按钮集来启动Activity。使用NavGraphBuilder.navigation()设置了编写导航,每个编写屏幕都有composable()调用,如下所示:

navigation(
    startDestination = "home",
    route = "main"
) {
    composable("home") {
       HomeScreen(...)
    }

    // Several more Screens

}

我已经了解了NavGraphBuilder.activity(),所以我在想:

activity("tickets") {
        this.activityClass = ExternalActivity::class
    }

如果ExternalActivity不需要任何数据传递给它,它就可以工作。
想到的唯一可行的替代方案是使用composable()并从那里启动活动:

composable("tickets") { backStackEntry ->
        val config = // get config from arguments
        context.startActivity(
            Intent(context, ExternalActivity::class.java).apply {
                putExtra("config", config)
            }
        )
    }

或者类似的东西。但是它有点乱,而且有一些副作用,所以我想避免它。
是否有办法使用activity()调用并将数据传递给正在启动的"活动"?
我受限于我工作的代码库的架构,所以是的,它需要是一个Activity(它实际上来自外部库)。
谢谢。

a8jjtwal

a8jjtwal1#

唯一与您尝试做的事情有点相似的是data

activity("tickets") {
    this.activityClass = ExternalActivity::class
    this.data = "Hello World".toUri()    <--
}

[ExternalActivity]
override fun onCreate(savedInstanceState: Bundle?) {
    ...
    val data = intent.data

但是data就是Uri,所以它可能不适合您的需要,特别是如果您要处理外部库的话,那么context.startActivity()将是下一个选择,就像您的第二种方法一样。
需要注意的一点是,当您使用context.startActivity()(而不是NavGraphBuilder.activity())时,您需要在Activity关闭时正确设置“当前”目的地(例如,调用navController.navigateUp()navController.popBackStack())。否则,它会跳回到您刚刚关闭的Activity,因为就NavController而言,您启动(现在已关闭)的Activity就是当前目的地。

相关问题