![](/img/trans.png)
[英]Android - Navigation Component with multiple menus for Bottom Navigation
[英]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。 我不能使用它,因为我的工厂有一些需要传递的参数的构造函数,而且我无法访问子片段上的这个参数。
所以,我被卡住了,看不到这个相当微不足道的问题的任何可能的解决方案
我有两次同样的问题。
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 }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.