我有一个登录 View 和另一个要在登录后显示的 View 。我将 MvvmCross 与 native Xamarin.Android 和 Xamarin.iOS 一起使用。
因此我有 2 个 View 模型,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() 方法中的导航不起作用?
也许 View 模型的 Initialize() 方法不是执行此导航的好点?
我尝试将 IsUserLogedIn 逻辑放入 View 生命周期的其他方法中,如 ViewAppearing()、ViewAppeared() 等,但没有成功。
谢谢!
最佳答案
而不是 RegisterAppStart<LoginViewModel>();
您可以自己注册MvxAppStart
并从那里检查用户是否已登录并直接转到您的 NavControllerViewModel
,否则转到 LoginViewModel
.您甚至可以在构造函数中注入(inject)您的身份验证服务。
创建您的 MvxAppStart
public class AppStart : MvxAppStart
{
private readonly IMvxNavigationService _navigationService;
private readonly IAuthenticationService _authService;
public AppStart(
IMvxApplication application,
IMvxNavigationService navigationService,
IAuthenticationService authService)
: base(application, navigationService)
{
_navigationService = navigationService ?? throw new ArgumentNullException(nameof(navigationService));
_authService = authService ?? throw new ArgumentNullException(nameof(authService));
}
protected override async Task NavigateToFirstViewModel(object hint = null)
{
var isUserLoggedIn = _authService.IsUserLoggedIn();
if (isUserLoggedIn)
{
await _navigationService.Navigate<NavControllerViewModel>();
}
else
{
await _navigationService.Navigate<LoginViewModel>();
}
}
}
注册您的 MvxAppStart
public class App : MvxApplication
{
public override void Initialize()
{
RegisterCustomAppStart<AppStart>();
}
}
关于c# - 初始化中的 Mvvmcross View 模型导航不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53222399/