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
数据。
假设有两个屏幕。
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)
非常适合我。
归档时间: |
|
查看次数: |
13359 次 |
最近记录: |