将数据传递到 Android Compose 中之前的可组合项

Dươ*_*inh 14 android android-jetpack-compose

我将采取一个简单的样本。

我有 2 个屏幕:屏幕 A 和屏幕 B。从屏幕 A,我打开屏幕 B。当我将屏幕 B 返回到屏幕 A 时,我想将数据传输回屏幕 A。

借助 Android Fragment,我可以使用 Shared ViewModel 或 Fragment Result API 来执行此操作。但对于 Android Compose,Fragment Result Api 不在 Compose 中。使用 Shard ViewModel 时,我必须附加 Shared ViewModel 的生命周期才能使其保持活动状态?活动,……或者其他什么。

或者还有其他方法可以做到这一点吗?

Noa*_*oah 22

如果您使用jetpack导航,则可以通过将数据添加到前一个返回堆栈条目的savedStateHandle来传回数据。(文档

屏幕B传回数据:

composable("B") {
  ComposableB(
    popBackStack = { data ->
      // Pass data back to A
      navController.previousBackStackEntry
        ?.savedStateHandle
        ?.set("key", data)

      navController.popBackStack()
    }
  )
}
Run Code Online (Sandbox Code Playgroud)

屏幕A接收数据:

composable("A") { backStackEntry ->
  // get data passed back from B
  val data: T by backStackEntry
    .savedStateHandle
    .getLiveData<T>("key")
    .observeAsState()

  ComposableA(
    data = data,
    navToB = {
      // optional: clear data so LiveData emits
      // even if same value is passed again
      backStackEntry.savedStateHandle.remove("key")
      // navigate ...
    }
  )
}
Run Code Online (Sandbox Code Playgroud)

替换"key"为唯一的字符串、T数据类型和data数据。


Ali*_*waz 6

假设有两个屏幕。

1 - 第一个屏幕它将接收一些数据并驻留在后台堆栈的底部,用户将通过按后退按钮从第二个屏幕登陆这里。

2 - SecondScreen它将发送/附加一些要在之前的第一个屏幕上接收的数据。

让我们从第二个屏幕发送数据开始,为此您可以执行以下操作:

                    navController.previousBackStackEntry
                        ?.savedStateHandle
                        ?.set("key", viewModel.getFilterSelection().toString())

                    navController.popBackStack()
Run Code Online (Sandbox Code Playgroud)

现在让我们在第一个屏幕上捕获该数据,您可以执行如下操作:

if (navController.currentBackStackEntry!!.savedStateHandle.contains("key")) {
        val keyData =
            navController.currentBackStackEntry!!.savedStateHandle.get<String>(
                "key"
            ) ?: ""
    }
Run Code Online (Sandbox Code Playgroud)

非常适合我。