我正在尝试检查应该从哪个页面开始加载我的应用程序,首先,我在检查数据库表时是否找到了存储的登录信息,所以我想在工作时推送一次名为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();
}
但是会引发以下异常,并且不建议这样做。 Exception 尝试的另一种方法是覆盖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;
}
}
答案 0 :(得分:0)
在Xamarin.Forms中,我们具有称为“ Application.Current.Properties”的属性。通过使用它,我们可以保存任何数据类型。因此,一旦用户登录到应用程序,您就可以设置一个标志并将其设置为true。然后,每次用户登录到应用程序后,您都可以检查该标志并浏览各自的页面。
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。然后,如果用户尝试登录,它将检查条件并导航到相应页面。
Application.Current.Properties["isLogged"] = true;
await Application.Current.SavePropertiesAsync();
在登录到应用程序后为上面的代码编写代码。如果用户从应用程序注销,则需要将'isLogged'标志设置为false。
答案 1 :(得分:0)
当操作系统要求您的应用显示页面时,它必须显示一个页面。它不能说“等一两分钟,当我通过虚弱的网络连接与该远程服务器通信时”。它必须立即显示一个页面。
因此,我建议您打开一个初始页面-例如您的公司或应用程序徽标。当显示初始页面时,然后调用InitializeAppAsync
,并根据结果切换到登录页面或开始页面或用户友好的脱机错误页面。