繁体   English   中英

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

[英]Share viewmodel between multiple fragments in Bottom Navigation with Android Navigation Component

我有应用程序,我在其中使用带有 navHost 的片段并将导航图连接到它。 这个片段,我们称之为主片段,需要下载一些数据,底部导航中的每个选项卡都会使用这些数据。 这看起来像是 Shared ViewModel 的完美使用。

但是没有明显的方法将它与底部导航一起使用。 有一个与 kotlin 委托一起使用的方法navGraphViewModels()

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

但这会产生异常:

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

因为根据文档,此方法正在寻找当前 backstack 上的 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>

现在,在初始化 ViewModel 时在片段内执行此操作

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

如果您需要传递视图模型工厂(可能用于注入视图模型),您可以这样做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM