Ожидайте метод до запуска приложения в том же потоке пользовательского интерфейса - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь проверить, какая страница должна загружать мое приложение в начале, прежде всего я проверяю таблицу базы данных, если я нахожу сохраненную информацию для входа в систему, я хочу нажать на StartPage (), как только я работаю с базой данных метод включает ожидание, если нет сохраненных данных, я хочу нажать LoginPage (). Я попытался следовать этому примеру Xamarin.Forms Async Task On Startup . Мой код:

public App()
    {

        int result;
        InitializeComponent();

        ThreadHelper.Init(SynchronizationContext.Current);
        ThreadHelper.RunOnUIThread(async () => {
            MainPage = new ActivityIndicatorPage();
            result = await InitializeAppAsync();
            if (result == 0)
            {
                PushLoginPage();
            }
            else
            {
                PushStartPage();
            }
        });



    }
 public void PushStartPage()
    {
        NavigationPage nav = new NavigationPage(new StartPage());
        nav.SetValue(NavigationPage.BarBackgroundColorProperty, Color.FromHex("#D60000"));
        MainPage = nav;
    }

    public void PushLoginPage()
    {
        MainPage = new Login();
    }

    public void PushLoginPage(string email, string password)
    {
        MainPage = new Login(email, password);
    }

    private async Task<int> InitializeAppAsync()
    {
        if (ViewModel == null)
            ViewModel = new MainViewModel(this);

        return  await ViewModel.LoginViewModel.PushInitialPage();


    }

Но выдает следующее исключение и, как говорит автор статьи, делать это не рекомендуется. Исключение Еще одна попытка переопределить метод OnStart (), но тоже не работает.

protected override async void OnStart()
    {
        Task.Run(async ()=> { await InitializeAppAsync(); });
    }

Метод PushInitialPage: публичная асинхронная задача PushInitialPage () {

        if (_app.Properties.ContainsKey("isLogged"))
        {
            var user = await UserDataBase.GetUserDataAsync();

            var result = await Login(user.Email, user.Password);


            if (result.StatusCode != 200)
            {
                return 0;
                ///PushLoginPage();
            }
            else
            {
                return 1;
                //PushStartPage();
            }

        }
        else
        {

            return 0;
        }
    }

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Когда ОС просит ваше приложение показать страницу, оно должно показать страницу. Он не может сказать «подождите минуту или две, пока я разговариваю с этим удаленным сервером через ненадежное сетевое соединение». Он должен показать страницу прямо сейчас.

Итак, я рекомендую открыть заставку - например, логотип вашей компании или приложения. Когда появится заставка, позвоните по номеру InitializeAppAsync и, в зависимости от результата, переключитесь на страницу входа в систему или стартовую страницу или на страницу с удобной офлайн-ошибкой, удобной для пользователя.

0 голосов
/ 16 января 2019

В Xamarin.Forms у нас есть свойства, называемые Application.Current.Properties. Используя это, мы можем сохранить любой тип данных. Поэтому, когда пользователь входит в приложение, вы можете установить один флаг и установить его в значение true. Затем каждый раз, когда пользователь входит в приложение, вы можете установить этот флажок и перейти на соответствующую страницу.

Пример кода:

App.cs:

public App()
{
 if (Current.Properties.ContainsKey("isLogged"))
 {
    if((bool)Application.Current.Properties["isLogged"])
    {
       // navigate to your required page.
    }
    else
    {
      // naviate to login page.
    }
 }
 else
 {
   // naviate to login page.
 }
}

При первом открытии приложения оно проверяет, присутствует свойство isLogged или нет, если нет, оно переместится на страницу входа. Когда пользователь входит в приложение, используя его учетные данные, нам нужно создать свойство isLoggin и установить значение true. Затем, если пользователь пытается войти в систему, он проверяет состояние и переходит на соответствующую страницу.

Сохранение свойства SampleCode:

Application.Current.Properties["isLogged"] = true;

await Application.Current.SavePropertiesAsync();

напишите код выше после входа в приложение. Если пользователь выходит из приложения, необходимо установить флаг «isLogged» в значение false.

...