MvvmCross ViewModels не уничтожено в FragmentManager.PopBackstackImmediate () - PullRequest
0 голосов
/ 06 июня 2018

Я создал приложение Xamarin для Android, которое предоставляет пользователю ряд форм ввода данных, например, мастер.Мастер имеет нижнюю панель навигации с предыдущими и последующими кнопками, а также кнопку меню, которая при нажатии отображает список всех форм в мастере и позволяет пользователю переходить к любой заданной форме.Желаемая функциональность заключается в сохранении линейной навигации, так что когда пользователь переходит к середине мастера, он все еще может использовать предыдущую и следующую кнопки для просмотра различных форм по порядку.Они также должны иметь возможность использовать аппаратную кнопку возврата для просмотра предыдущей формы в мастере.Я подозреваю, что моя реализация не является дружественной к MvvmCross, потому что я вижу некоторые ошибки с ней, особенно мои viewmodels не уничтожаются, когда я очищаю backstack фрагмента (мастер, размещенный в Activity, каждая форма является Fragment).

Как мне это реализовать?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

В моей реализации должно быть что-то необычное, но с крайним сроком и небольшой помощью сообщества, что вы делаете, чтобы исправить свой взлом, но взломать его больше?

Мое решение было двояким:1) вместо того, чтобы использовать FragmentManager.PopBackstackImmediate (), я реализовал цикл while с условием: activity.SupportFragmentManager.BackStackEntryCount> 0, вызывая метод Close (фрагмент.ViewModel) в теле.Это должно было исправить ошибку, но это не так.2) ViewModels, которые я запрашивал для закрытия, все еще не были утилизированы, поэтому мне пришлось разрешить текущий IMvxMultipleViewModelCache и вызвать для него GetAndClear с ожидаемыми параметрами.Это заставило мои модели ViewModel избавиться от них, чтобы они были воссозданы при следующем просмотре его фрагмента.

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

0 голосов
/ 06 июня 2018

Вы пытались использовать эту перегрузку PopBackStackImmediate?Этот будет извлекать все фрагменты до тех пор, пока вы не укажете тот, который вы указали в строке (если пропущен флаг включения, тогда этот фрагмент также выталкивается), так что вы сэкономите итерации по всему обратному стеку фрагмента.

Activity.SupportFragmentManager.PopBackStackImmediate("myViewTag", (int)PopBackStackFlags.Inclusive);

где"myViewTag" - это UniqueImmutableCacheTag вашего взгляда

...