Проблема при использовании нескольких экземпляров одного фрагмента с одной и той же ViewModel в Viewpager - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть фрагмент (FRAG1) с моделью представления (VM1). Я создаю два новых экземпляра этого фрагмента в FragmentPagerAdapter для загрузки внутри ViewPager.

Viewpager присутствует внутри родительского фрагмента.

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)
        }
    }
}

Фрагмент создает новый создает экземпляр ViewModel в OnCreate ()

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
}

Это позже установлено на Binding в OnCreateView ()

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 и ИСТИНА во второй. Но после создания второй виртуальной машины модель представления фрагмента будет ИСТИНА.

Аналогично, наблюдатели LiveData в первой ViewModel не работают.

Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Проблема не в фрагменте или в представлении модели.

Модели представления содержат экземпляр или класс репозитория.Я по ошибке предоставил один и тот же экземпляр класса Repository обеим моделям представления.

Это привело к сохранению данных во всех моделях представления.

0 голосов
/ 06 сентября 2018

Дело в том, что вы создаете ViewModels с AndroidViewModelFactory, который содержит один и тот же экземпляр для всех моделей вне представления, если вы используете одну и ту же модель представления во всех фрагментах. Возможно, стоит подумать о создании моделей представления с помощью вызова:

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

Это даст вам всегда новый экземпляр модели представления для каждого фрагмента. Или, если вы хотите подключить ту же активность, просто передайте вместо фрагмента действие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...