簡體   English   中英

通過 navGraphViewModel 導航返回時保留 ViewModel 實例

[英]Keep ViewModel instance when navigating back with by navGraphViewModel

因此,我遵循 Google 的方法,您對整個應用程序和多個視圖模型使用單個活動,這些模型的范圍僅限於您的嵌套導航圖或片段。

我對這種方法有疑問。 讓我們使用谷歌文檔提供的示例,這樣對我來說會更容易。

循環邏輯

在這里,當用戶到達目的地 C 時,后退堆棧包含每個目的地(A、B、C)的一個實例,如果我們想返回目的地 A 而不在后退堆棧中增加目的地的實例 - 我們需要添加popUpTo="@+id/a"popUpToInclusive="true"清除后棧中的所有實例。

這就是問題所在 - 如果我們將使用它,那么每個舊的目的地實例都將被清除,並且將創建新的 A 實例因此如果我們使用by navGraphViewModel(R.id.A)那么我們的舊 ViewModel 實例將被清除也!

那么如何避免這種行為呢? 有沒有辦法在不創建新實例的情況下打開目標 A,這樣我們的視圖 model 也不會被清除?

我嘗試了多種方法來防止這種情況,但似乎沒有任何效果(在這種情況下 A - 也可能是嵌套圖,並且工作方式相同)

編輯:我剛剛再次閱讀了您的問題,我想我第一次誤解了它。 我的回答可能幫不上什么忙。

您是否需要子(嵌套)NavGraphs? 如果不是,我認為navGraphViewModels()用於您。 根據我的閱讀,使用這種方法創建的視圖模型在完成相應的 NavGraph 后會被清除。

當我們為某些模塊創建片段並且我們不希望這些視圖模型在整個活動中持續存在時,navGraphViewModels 非常有用。 因此,我們可以使用 navGraphViewModels() 創建我們自己的自定義子導航圖。

也就是說,如果你只是想實現單個活動/多個片段架構,為什么不使用每個片段內部by activityViewModels() 使用它,只要主機活動還活着,視圖模型實例就會被持久化。 從而允許您在活動和所有片段之間共享數據。

參考: https://skynight1996.medium.com/navigation-component-comparison-between-viewmodels-activityviewmodels-and-ae0145734228

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM