簡體   English   中英

在 Viewpager 中使用具有相同 ViewModel 的相同 Fragment 的多個實例時出現問題

[英]Problem while using multiple instance of same Fragment with same ViewModel in Viewpager

我有一個帶有視圖模型 (VM1) 的片段 (FRAG1)。 我正在 FragmentPagerAdapter 中創建此片段的兩個新實例以加載到 ViewPager 中。

Viewpager 存在於父 Fragment 中。

兩個片段實例中的 ViewModels 似乎都不是唯一的。 兩個片段實例似乎都具有在最后初始化的第二個片段中創建的 ViewModel 實例的屬性。

private inner class ItDeclarationFragAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm)
{
    override fun getItem(position: Int): Fragment
    {
        return when (position)
        {
            0 -> ITDeclarationSummaryFragment.newInstance(false)
            1 -> ITDeclarationSummaryFragment.newInstance(true)

            else -> ITDeclarationSummaryFragment.newInstance(false)
        }
    }

    override fun getCount(): Int
    {
        return 2
    }

    override fun getPageTitle(position: Int): CharSequence?
    {
        return when (position)
        {
            0 -> resources.getString(R.string.zpl_itDeclaration_tile)
            1 -> resources.getString(R.string.zpl_itDeclaration_poi_title)

            else -> resources.getString(R.string.zpl_reimbursements_summary)
        }
    }
}

Fragment 在 OnCreate() 中創建新創建的 ViewModel 實例

override fun onCreate(savedInstanceState: Bundle?)
{
    super.onCreate(savedInstanceState)

    vm = ViewModelProvider.AndroidViewModelFactory.getInstance(activity!!.application).create(ITDeclarationSummaryViewModel::class.java)
    vm.setRepository(getRepo())
    vm.mIsPOI = arguments!![StringConstants.isPOI]!! as Boolean
}

稍后在 OnCreateView() 上設置為 Binding

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?
{
    mView = inflater.inflate(R.layout.declaration_summary_fragment, container, false)

    mBinding       = DeclarationSummaryFragmentBinding.bind(mView!!)
    mBinding.model = vm
    mBinding.setLifecycleOwner(this)

    return mBinding.root
}

但是兩個片段中的視圖模型似乎都保留了第二個片段的值。 它們似乎並不獨立和獨特。

例如,

視圖模型中有一個布爾值,在第一個 ViewModel 中為 FALSE,在第二個中為 TRUE。 但是一旦創建了第二個 VM,片段視圖模型就會為 TRUE。

同樣,第一個 ViewModel 中 LiveData 的觀察者不起作用。

請幫我解決這個問題。 提前致謝。

問題是您正在使用 AndroidViewModelFactory 創建 ViewModels,如果您在所有片段中使用相同的視圖模型,它為所有視圖模型保存相同的實例。 也許可以考慮通過調用來創建視圖模型:

ViewModelProviders.of(fragment).get(ViewModel.class)

這將始終為您提供每個片段的視圖模型的新實例。 或者,如果您想掛鈎相同的活動,只需傳遞而不是片段,活動。

問題不是因為 Fragment 或 View Model。

視圖模型包含一個實例或一個 Repository 類。 我錯誤地為兩個 ViewModel 提供了相同的 Repository 類實例。

這導致數據在 ViewModel 中持續存在。

暫無
暫無

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

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