你好吗?
使用Jetpack Navigation,我无法将参数从子片段发送到父片段作为父片段中的第一个信息。根据LiveData接收参数。 我正在尝试使用: findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData 并且 SharedViewModel 与 navGraphViewModels。
但由于是LiveData,所以回报是不确定的。所以,有时它们会先被调用,有时 UI 会在 OnViewCreated 中先被调用,然后再调用上面的方法。
我需要一种方法来始终接收参数作为返回父级时的第一件事,以便可以执行一些条件。
有这样的模式吗? 谢谢你。
为了接收返回的数据,需要注意的是Lifecycle必须处于RESUME状态
为
Fragment
创建扩展
fun <T> Fragment.setNavigationResult(key: String, value: T) {
findNavController().previousBackStackEntry?.savedStateHandle?.set(
key,
value
)
}
fun <T>Fragment.getNavigationResult(@IdRes id: Int, key: String, onResult: (result: T) -> Unit) {
val navBackStackEntry = findNavController().getBackStackEntry(id) ?: return
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME
&& navBackStackEntry.savedStateHandle.contains(key)
) {
val result = navBackStackEntry.savedStateHandle.get<T>(key)
result?.let(onResult)
navBackStackEntry.savedStateHandle.remove<T>(key)
}
}
navBackStackEntry.lifecycle.addObserver(observer)
viewLifecycleOwner.lifecycle.addObserver(LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_DESTROY) {
navBackStackEntry.lifecycle.removeObserver(observer)
}
})
}
子片段
setNavigationResult("data", data)
findNavController().navigateUp()
父片段
findNavController()?.navigate(directions) // Navigate to child
getNavigationResult<Boolean>(R.id.nav_to_child, "data"){
// Return data here
}
希望有帮助!