如何使用 Android 导航组件将值传递回先前的片段目的地?

2023-11-26

让 sat 我有一些这样的目的地

从片段A --> 到片段B --> 到片段C

我可以使用安全参数将数据从片段 A 传递到片段 B,也可以使用安全参数从片段 B 传递到片段 C。

如果我想将片段 C 中生成的字符串带回片段 B 或片段 A 该怎么办?

要从片段 C 导航到片段 B,我使用代码:

Navigation.findNavController(fragmentView).navigateUp()

为了从片段 C 导航到片段 A,我使用代码:

Navigation.findNavController(view).popBackStack(R.id.fragmentA, false)

那么如何将值传递回之前的片段目的地呢?我是否必须执行从片段 C 到片段 B 的操作并通过 safe args 传递值?

真的需要你的帮助。非常感谢 :)


您可以使用下面的代码片段将数据发送到上一个片段。

片段A观察数据:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<String>("key")?.observe(viewLifecycleOwner) { data ->
        // Do something with the data.
    }
}

片段B发送数据:

findNavController().previousBackStackEntry?.savedStateHandle?.set("key", data)
findNavController().popBackStack()

我还为此编写了扩展。

fun <T : Any> Fragment.setBackStackData(key: String,data : T, doBack : Boolean = true) {
    findNavController().previousBackStackEntry?.savedStateHandle?.set(key, data)
    if(doBack)
    findNavController().popBackStack()
}

fun <T : Any> Fragment.getBackStackData(key: String, result: (T) -> (Unit)) {
    findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<T>(key)?.observe(viewLifecycleOwner) {
        result(it)
    }
}

Usage:

片段A:

getBackStackData<String>("key") { data ->
    // Do something with the data.
}

片段B:

setBackStackData("key",data)

    

注意:我使用字符串作为数据。您可以使用任何其他类型的变量。

注意:如果您要使用类作为数据,请不要忘记添加@Parcelize注释和扩展Parcelable.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Android 导航组件将值传递回先前的片段目的地? 的相关文章