【问题标题】:Jetpack Compose navigate for resultJetpack Compose 导航结果
【发布时间】:2021-03-27 23:37:27
【问题描述】:

我在 Compose 版本中使用 Jetpack Navigation 库。我正在设置导航,就像显示 here

我希望能够从屏幕 A 导航到屏幕 B。一旦 B 执行某些操作并从返回堆栈中弹出,它将返回屏幕 A 可以访问的结果。

我找到了一种使用活动here 来执行此操作的方法,但我想避免创建任何额外的活动并在 compose 中执行此操作。

【问题讨论】:

  • return a result 的功能也适用于 Navigation Compose;它是导航的核心部分。

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


【解决方案1】:

从您要返回数据的 Composable 中,您可以执行以下操作:

navController.previousBackStackEntry
    ?.savedStateHandle
    ?.set("your_key", "your_value")
navController.popBackStack()

然后,您可以从源 Composable 中使用 LiveData 监听更改。

val secondScreenResult = navController.currentBackStackEntry
    ?.savedStateHandle
    ?.getLiveData<String>("your_key")?.observeAsState()
...
secondScreenResult?.value?.let {
    // Read the result
}

【讨论】:

  • 你真的试过了吗?因为对我来说接收值始终是null
  • 您的回答节省了我的时间。谢谢
  • 消费时别忘了拿掉钥匙。
  • 有没有办法使用 ViewModel 中的 SavedStateHandle 而不是在可组合中监听?
  • @ScottCooper 是的,请参阅下面的帖子。
【解决方案2】:
val navController = rememberNavController()
composable("A") {
    val viewmodel: AViewModel = hiltViewModel()
    AScreen()
}
composable("B") {
    val viewmodel: BViewModel = hiltViewModel()
    val previousViewmodel: AViewModel? = navController
        .previousBackStackEntry?.let {
            hiltViewModel(it)
        }
    BScreen(
       back = { navController.navigateUp() },
       backWhitResult = { arg ->
           previousViewmodel?.something(arg)
       }
    )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2022-11-24
    • 2021-10-13
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多