您可以使用以下代码片段将数据发送到上一个片段。
观察数据的片段A:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<String>("key")?.observe(viewLifecycleOwner) { 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)
}
}
使用方法:
片段 A:
getBackStackData<String>("key") { data ->
// Do something with the data.
}
片段 B:
setBackStackData("key",data)
注意:我正在使用字符串作为数据。你可以使用任何其他类型的变量。
注意:如果你要使用类作为数据,请不要忘记添加
@Parcelize
注解并扩展
Parcelable
。