我有登录视图和登录后显示的另一个视图 . 我正在使用MvvmCross与原生Xamarin.Android和Xamarin.iOS .
因此我有2个viewmodel,LoginViewModel和MenuViewModel . 我注册appstart:
RegisterAppStart<LoginViewModel>();
在LoginViewModel中,我检查用户是否已经进入 . 如果已登录,我想导航到MenuViewModel并停止显示LoginViewModel .
public override async Task Initialize()
{
await base.Initialize();
await AppConfig.Initialize();
bool isLoggedIn = _authService.IsUserLoggedIn();
if (isLoggedIn)
{
await _navigationService.Navigate<NavControllerViewModel>();
await _navigationService.Close(this);
}
}
上面的代码不起作用,显示的是LoginView而不是MenuView . 但它的作用是在LoginView完全加载并且用户与之交互后的导航 . 所以我有一个登录用户LoginCommand的命令,登录用户,如果这个操作成功,那么我导航到MenuViewModel . 就像是:
private async Task Login()
{
if (!string.IsNullOrWhiteSpace(Username) && !string.IsNullOrWhiteSpace(Password))
{
if (Validations.IsValidEmail(Username))
{
OAuthResponse response = await UserController.Instance.Login(Username, Password);
if (response.Error != null)
{
//Login NOk
Mvx.IoCProvider.Resolve<IUserDialogs>().Alert(response.Error.Msg);
}
else
{
//Login OK
ShowMenuScreenCommand.Execute(null);
}
}
else
{
Mvx.IoCProvider.Resolve<IUserDialogs>().Alert("LoginView_Alert_InvalidEmail".Translate());
}
}
else
{
Mvx.IoCProvider.Resolve<IUserDialogs>().Alert("LoginView_Alert_MissingRequiredFields".Translate());
}
}
使用ShowMenuScreenCommand定义如下:
public IMvxAsyncCommand ShowMenuScreenCommand
{
get
{
_navigateCommand = _navigateCommand ?? new MvxAsyncCommand(async () => await _navigationService.Navigate<NavControllerViewModel>());
return _navigateCommand;
}
}
为什么Initialize()方法中的导航不起作用?
也许是视图模型的Initialize()方法不是一个很好的点来做这个导航?
我试图将IsUserLogedIn逻辑放入ViewAppearing(),ViewAppeared()等视图生命周期的其他方法中,但没有成功 .
谢谢!
1 回答
而不是
RegisterAppStart<LoginViewModel>();
您可以注册自己的
MvxAppStart
并从那里检查用户是否已登录并直接转到NavControllerViewModel
,否则请转到LoginViewModel
. 您甚至可以在构造函数中注入您的身份验证服务 .Create your MvxAppStart
Register your MvxAppStart