您可以使用下面的代码片段将数据发送到上一个片段。
片段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
.