首页 文章

初始化中的Mvvmcross View模型导航不起作用

提问于
浏览
2

我有登录视图和登录后显示的另一个视图 . 我正在使用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 回答

  • 0

    而不是 RegisterAppStart<LoginViewModel>();

    您可以注册自己的 MvxAppStart 并从那里检查用户是否已登录并直接转到 NavControllerViewModel ,否则请转到 LoginViewModel . 您甚至可以在构造函数中注入您的身份验证服务 .

    Create your 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>();
            }
        }
    }
    

    Register your MvxAppStart

    public class App : MvxApplication
    {
        public override void Initialize()
        {
            RegisterCustomAppStart<AppStart>();
        }
    }
    

相关问题