FreshMVVM и перезагрузка виртуальной машины перед тем, как включить модал - PullRequest
3 голосов
/ 11 февраля 2020
  • FreshMVVM 3.0.0
  • Xamarin Forms 4.2

Несколько наших входных страниц загружаются модально, и когда пользователь нажимает Сохранить, мы выполняем Command как this

var newTemperature = new Temperature()
{
    Date = DateTime.Now,
    Value = this.TemperatureValue,
    CaptureType = CaptureType.Manual,
    IsModified = true,
};

await this.Services.DataService.SaveAsync(newTemperature);

// Save completed, now close modal.
await this.CoreMethods.PopPageModel(data, modal, animate);

Если вы посмотрите на вызов CoreMethods.PopPageModel в GitHub , вы увидите, что он имеет дело с двумя процессами

  1. Повышение сигнала PageWasPopped
  2. Вызов службы навигации для извлечения страницы из стека навигации

Код FreshMVVM, который обрабатывает извлекаемую страницу, находится в FreshPageModel . Помимо прочего, код отсоединяется от событий «Появление» и «Исчезновение» и устанавливает BindingContext в значение null . Как вы можете видеть из приведенного выше порядка, это означает, что BindingContext на View устанавливается равным нулю, прежде чем он выталкивается из стека.

Проблема в том, что в течение короткого промежутка времени от 0,5 до 1,5 секунд пользователь видит View, который выглядит так, как будто все данные были сброшены. Это может быть весьма неприятно, если они только что нажали кнопку Сохранить.

Если я переверну порядок логики c в PopPageModel и выскользну из стека навигации перед вызовом RaisePageWasPopped, эта проблема исчезнет.

Никто еще не сталкивался с этой проблемой раньше?

Есть ли пользователи FreshMVVM, которые хотят указать на ошибку предложенного мной подхода?

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Наше решение этой проблемы состояло в том, чтобы реализовать наш собственный метод PopPageModel, который по существу меняет порядок так, чтобы PopPage вызывался в стеке навигации перед вызовом RaisePageWasPopped

Это то, что мы вызываем, когда мы хочу закрыть страницу

public Task DismissAsync(bool modal = true, bool animate = true)
{
    return this.DispatcherService.RunOnUiThreadAsync(
        async () =>
            {
                string navServiceName = this.CurrentNavigationServiceName;
                if (this.IsModalFirstChild)
                {
                    await this.CoreMethods.PopModalNavigationService(true);
                }
                else
                {
                    IFreshNavigationService rootNavigation = FreshIOC.Container.Resolve<IFreshNavigationService>(navServiceName);
                    await rootNavigation.PopPage(modal, animate);

                    if (modal)
                    {
                        this.RaisePageWasPopped();
                    }
                }
            });
}
0 голосов
/ 21 февраля 2020

Просто обратите внимание, что служба находится в ожидании, удерживая пользовательский интерфейс до завершения службы, пытались ли вы удалить await и сразу же открыть страницу или отобразить загрузчик, когда служба занята?

this.InsertReports(metadata.Reports).ConfigureAwait(false);

...