如何将参数从Detail Fragment发送到Parent Fragment并且Parent首先接收到它?

问题描述 投票:0回答:1

你好吗?

使用Jetpack Navigation,我无法将参数从子片段发送到父片段作为父片段中的第一个信息。根据LiveData接收参数。 我正在尝试使用: findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData 并且 SharedViewModelnavGraphViewModels

但由于是LiveData,所以回报是不确定的。所以,有时它们会先被调用,有时 UI 会在 OnViewCreated 中先被调用,然后再调用上面的方法。

我需要一种方法来始终接收参数作为返回父级时的第一件事,以便可以执行一些条件。

有这样的模式吗? 谢谢你。

android parameters navigation android-livedata master-detail
1个回答
0
投票

为了接收返回的数据,需要注意的是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
}

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.