使用 Compose Navigation 启动 Activity

问题描述 投票:0回答:2

我试图通过单击底部导航栏上设置的按钮来启动活动。有一个使用

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?

我受到我所工作的代码库架构的限制,所以是的,它需要是一个 Activity(它实际上来自外部库)。

谢谢。

android android-jetpack-compose android-navigation jetpack-compose-navigation
2个回答
0
投票

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

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 就是当前目的地。


0
投票

您必须提供额外内容作为参数:

activity("tickets/{EXTRA_NAME}") {
    argument("EXTRA_NAME") { type = NavType.StringType }
    activityClass = ExternalActivity::class
}
   

然后您可以通过以下方式导航至活动:

navController.navigate("tickets/EXTRA_VALUE")

一切都在那里:https://developer.android.com/guide/navigation/design/kotlin-dsl#args

© www.soinside.com 2019 - 2024. All rights reserved.