【问题标题】:Starting Activity using Compose NavigationStarting Activity using Compose Navigation
【发布时间】:2022-12-28 04:33:33
【问题描述】:

I'm trying to launch an Activity by clicking on a button set on a BottomNavBar. There's a Compose Navigation set up using NavGraphBuilder.navigation() with a composable() call for each Compose screen like:

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

    // Several more Screens

}

I've found out about NavGraphBuilder.activity(), so I was thinking something like:

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

And it works, if ExternalActivity doens't need any data to be passed to it. But it does.

The only viable alternative that comes to mind is using a composable() and launching the activity from there:

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

Or something along those lines. But it's kind of messy and has some side effects, so I'd like to avoid it.

Is there any way to use the activity() call and pass data to the Activity being launched?

I'm limited by the architecture of the codebase in which I'm working, so yes, it needs to be an Activity (it's actually from an external library).

Thanks.

【问题讨论】:

    标签: android android-jetpack-compose android-navigation jetpack-compose-navigation


    【解决方案1】:

    The only thing that remotely resembles what you are trying to do would be data.

    activity("tickets") {
        this.activityClass = ExternalActivity::class
        this.data = "Hello World".toUri()    <--
    }
    
    [ExternalActivity]
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        val data = intent.data
    

    But data is Uri, so it might not suit your needs, especially if you are dealing with an external library. Then context.startActivity() would be the next choice, as in your second approach.

    One thing to note is that when you use context.startActivity() (instead of NavGraphBuilder.activity()), you need to set the "current" destination correctly when the Activity closes (e.g. call navController.navigateUp() or navController.popBackStack()). If not, it will jump back to the Activity you just closed, because as far as NavController is concerned, the Activity you started (and now closed) is the current destination.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多