使用Android导航将数据传回上一个片段

rub*_*n94 6 android android-navigation koin android-jetpack android-architecture-navigation

我已经开始使用Android体系结构组件(导航和安全Args,视图模型)以及Koin库。

目前,我在两个片段之间传递参数时遇到了问题-我需要将一个字符串值从片段A传递到片段B,在片段B中修改此值,然后将其传递回片段A。

我找到了解决我的问题的一种可能的方法-共享视图模型。不幸的是,这种方法有一个问题,因为我可以在屏幕之间传递和修改值,但是当片段A导航到另一个目标时,共享视图模型中的值仍会存储而不清除。

在Android导航中的片段之间传递和修改数据是否有其他解决方案?我想避免手动清除此值(当碎片A被破坏时)。

zgl*_*uis 38

Android 刚刚为此发布了一个解决方案;在目的地导航 2.3.0-alpha02之间传递数据,基本上,在片段 A 中,您观察变量的变化,而在片段 B 中,您在执行之前更改该值popBackStack()

片段A:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val navController = findNavController();
// We use a String here, but any type that can be put in a Bundle is supported
navController.currentBackStackEntry?.savedStateHandle?.getLiveData<String>("key")?.observe(
    viewLifecycleOwner) { result ->
    // Do something with the result.
  }
}
Run Code Online (Sandbox Code Playgroud)

片段B:

navController.previousBackStackEntry?.savedStateHandle?.set("key", result)
navController.popBackStack()
Run Code Online (Sandbox Code Playgroud)

  • 注意:Hilt 注入 ViewModel 的 SavedStateHandle 和 NavBackStackEntry SavedStateHandle 不是同一个对象。我花了几个小时才弄清楚这一点 (10认同)

小智 -7

1) 使用 action_A_to_B 和 SafeArgs 将字符串从片段 A 传递到片段 B。

2)popBackStack删除Fragment B。

navController.popBackStack(R.id.AFragment, false);
Run Code Online (Sandbox Code Playgroud)

或者

navController.popBackStack();
Run Code Online (Sandbox Code Playgroud)

3) 然后使用action_B_to_A将修改后的数据从B传递到A。

编辑。

这里有另一种解决方案