Восстановление стека навигации при возобновлении работы приложения Xamarin.Forms - PullRequest
0 голосов
/ 26 апреля 2019

Я создаю приложение с этими страницами в следующем порядке:

(P): ContentPage
(V): ContentView размещено на ContentPage.
->: вызов или код выполняется.

(P) Main
   -> If login not detected, automatically goes to:
       (P) Startup
           (P) Sign up, has these ContentViews as registration steps:
               (V) Email and password
               (V) Name
               (V) Profile photo
                   -> Call to CrossMedia.Current.TakePhotoAsync
               (V) Other details
                   -> Returns to Main, if has successful profile creation.
           (P) Sign in
               -> Returns to Main, if has successful login.
   -> If login detected:
        -> Load the content of the Main page.

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

Есть ли способ решить эту проблему? Как? Должен ли я сохранить стек навигации где-нибудь в методе OnSleep? Как насчет DataContext каждой страницы? Как я могу сохранить их?

Есть ли какой-нибудь способ предотвратить это?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Хорошо, я смог обнаружить проблему, добавив точки останова в методах запуска MainPage.

В основном мне нужно было проверить, была ли страница уже загружена или нет, с помощью простой переменной bool (_loaded).

    protected override async void OnAppearing()
    {
        base.OnAppearing();

        IsBusy = true;

        if (!_loaded && !await ViewModel.Auth.IsLoggedIn())
        {
            _loaded = true;
            await App.NavigationHelper.NavigateModalAsync(new Startup(), false);
        }

        IsBusy = false;
    }

Когда приложение возобновляет работу, даже при переключении приложений, например камеры, MainPage выполнял метод OnAppearing.

Нет другого вызова этой страницы, кроме как в конструкторе App.xaml.cs, поэтому инфраструктура должна вызывать его, потому что это главная страница приложения.

0 голосов
/ 26 апреля 2019

вы можете установить свойство уровня приложения, когда ваше приложение переходит в спящий режим или ваш contentPage исчезает. Если это правда, вы можете пропустить регистрацию в методе резюме и позволить пользователю возобновить приложение с того места, где оно осталось.

В приложении. Xaml.cs

public static bool IsSignUpInProgress{get;set;}

protected override void OnSleep()
        {
            if(Application.Current.MainPage==typeof(SignUpPage))
                IsSignUpInProgress=true;
        }
protected override void OnResume()
    {
        if(IsSignUpInProgress==false)
            {
                //Do your login check.
             }
    }
...