首页 > 解决方案 > 如何使用导航架构组件从片段中获取结果?

问题描述

假设我们有两个片段:MainFragmentSelectionFragment。第二个是为选择一些对象而构建的,例如一个整数。从第二个片段接收结果有不同的方法,如回调、总线等。

现在,如果我们决定使用导航架构组件来导航到第二个片段,我们可以使用以下代码:

NavHostFragment.findNavController(this).navigate(R.id.action_selection, bundle)

wherebundleBundle(当然)的一个实例。如您所见SelectionFragment,我们无法访问可以放置回调的位置。问题是,如何使用导航架构组件接收结果?

标签: androidandroid-architecture-componentsandroid-jetpackandroid-architecture-navigation

解决方案


他们在 2.3.0-alpha02 版本中为此添加了修复程序。

如果从Fragment A导航到Fragment B并且A需要来自B的结果:

findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<Type>("key")?.observe(viewLifecycleOwner) {result ->
    // Do something with the result.
}

如果在Fragment B上并且需要设置结果:

findNavController().previousBackStackEntry?.savedStateHandle?.set("key", result)

我最终为此创建了两个扩展:

fun Fragment.getNavigationResult(key: String = "result") =
    findNavController().currentBackStackEntry?.savedStateHandle?.getLiveData<String>(key)

fun Fragment.setNavigationResult(result: String, key: String = "result") {
    findNavController().previousBackStackEntry?.savedStateHandle?.set(key, result)
}

推荐阅读