使用 Android 导航组件在底部导航中的多个片段之间共享视图模型



我有应用程序,我在其中使用带有 navHost 和连接的导航图的片段。这个片段,我们称之为主片段需要下载一些数据,这些数据将被底部导航中的每个选项卡使用。这看起来像是共享视图模型的完美用法。

但是没有明显的方法可以将其与底部导航一起使用。有一种方法navGraphViewModels()与 kotlin 委托一起使用:

val parentViewModel: CourtDetailRootVM by navGraphViewModels(R.id.court_detail)

但这会产生异常:

java.lang.IllegalArgumentException: No destination with ID 2131296449 is on the NavController's back stack

因为根据文档,此方法正在寻找当前反向堆栈上的 viewModel,而底部导航并非如此!

还有其他一些获取父视图模型的方法,但所有这些方法都需要重用 ViewModelFactory。我不能使用它,因为我的工厂有一些参数的构造函数,需要传递,而且我无法访问子片段上的这些参数。

所以,我被困住了,看不到这个相当微不足道的问题的任何可能的解决方案

我两次遇到同样的问题。

  1. 第一个问题是我创建了一个新的导航文件并使用.这在技术上应该有效,但我遇到了同样的错误。 所以我通过选择需要在导航图中组合在一起的所有片段来修复它并right-click->move to nested graph->new graph

这将创建这样的东西:

<navigation 
android:id="@+id/checkout_graph" 
app:startDestination="@id/cartFragment">
<fragment android:id="@+id/orderSummaryFragment".../>
<fragment android:id="@+id/addressFragment" .../>
<fragment android:id="@+id/paymentFragment" .../>
<fragment android:id="@+id/cartFragment" .../>
</navigation>

现在,当您初始化视图模型时,在片段中执行此操作

val viewModel: CheckoutViewModel by navGraphViewModels(R.id.checkout_graph)

如果你需要传递视图模型工厂(可能是为了注入视图模型(,你可以这样做:

val viewModel: CheckoutViewModel by navGraphViewModels(R.id.checkout_graph) { viewModelFactory }
  1. 第二个问题是我在初始化视图模型时使用的 ID 错误。因此,请确保您使用的是当前用于初始化视图模型的导航图。

相关内容

  • 没有找到相关文章

最新更新