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

标签 c# xamarin xamarin.ios xamarin.android mvvmcross

我有一个登录 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/

相关文章:

c# - 使用 C# 进行 SQL Server 连接管理

c# - 如何填充元素数量由变量确定的元组列表

c# - ASP.NET Identity 中使用的哈希方法

listview - Xamarin.Forms - ListView 未在 OnAppearing 方法中更新

ios - 加载 5MB 的图像导致 iPad 崩溃

c# - 如何让这个异常处理代码遵守DRY原则?

javascript - 如何将媒体从 text/plain 更改为 application/json?

ios - 如何检索当前键盘的语言?

c# - 当父级滚动时隐藏 float 操作按钮

ios - 缓存多少?