在 Xamarin Prism 中,如果说用户已经登录,你如何重定向

问题描述

我的过程很简单,但在 xamarin 中似乎非常复杂。

我的所有页面都需要“重定向”机制,主要是因为已登录/超时(API 刷新令牌等) 所以无论在下面的问题中有效,都将解决我所有的问题。 (这就是为什么我不在 App.cs 中进行以下登录检查)

如果用户登录.. 重定向到主页。

那么如何重定向一个变量一直 == 真。

Loginviewmodel 上的以下代码在发生这种情况时表现得非常奇怪:

  1. 登录 = 真
  2. Homeviewmodel 中的代码以某种方式运行,加载数据等
  3. 页面停留在登录页面。毫无意义。

     public override async void OnNavigatedTo(INavigationParameters parameters)
            {
             
                    bool loggedin = await _authHelperService.isLoggedIn();
                    if (loggedin)
                        await _navigationService.NavigateAsync("/MasterDetail/NavigationPage/Home");
              
      }

我怀疑它与 async void 有关,但无论如何我都看不到将其更改为 Task,因为它覆盖了 void。

在其他覆盖(初始化等)中尝试相同的“重定向代码会产生相同的结果。 重定向应该在哪里发生?

我所有的页面都继承自这个:

 public abstract class AppMapviewmodelBase : BindableBase,IInitialize,INavigationAware,IConfirmNavigation,IDestructible
{

    private bool _isBusy;
    public bool IsBusy
    {
        get => _isBusy;
        set => SetProperty(ref _isBusy,value);
    }

   


    const string RootUriPrependText = "/";
    DelegateCommand<string> _navigateAbsoluteCommand;
    DelegateCommand<string> _navigateCommand;
    DelegateCommand<string> _navigateModalCommand;
    DelegateCommand<string> _navigateNonModalCommand;

    private bool _isNotConnected;
    public bool IsNotConnected
    {
        get
        {
            if (DesignMode.IsDesignModeEnabled)
            {
                return false;
            }
            else
            {
                return _isNotConnected;
            }
        }
        set
        {
            SetProperty(ref _isNotConnected,value);
        }
    }


    /// <summary>
    /// Gets the navigate absolute command.
    /// </summary>
    /// <value>The navigate absolute command.</value>
    public DelegateCommand<string> NavigateAbsoluteCommand => _navigateAbsoluteCommand ?? (_navigateAbsoluteCommand = new DelegateCommand<string>(NavigateAbsoluteCommandExecute,CanNavigateAbsoluteCommandExecute));

    /// <summary>
    /// Gets the navigate command.
    /// </summary>
    /// <value>The navigate command.</value>
    public DelegateCommand<string> NavigateCommand => _navigateCommand ?? (_navigateCommand = new DelegateCommand<string>(NavigateCommandExecute,CanNavigateCommandExecute));

    /// <summary>
    /// Gets the navigate modal command.
    /// </summary>
    /// <value>The navigate modal command.</value>
    public DelegateCommand<string> NavigateModalCommand => _navigateModalCommand ?? (_navigateModalCommand = new DelegateCommand<string>(NavigateModalCommandExecute,CanNavigateModalCommandExecute));

    /// <summary>
    /// Gets the navigate non modal command.
    /// </summary>
    /// <value>The navigate non modal command.</value>
    public DelegateCommand<string> NavigateNonModalCommand => _navigateNonModalCommand ?? (_navigateNonModalCommand = new DelegateCommand<string>(NavigateNonModalCommandExecute,CanNavigateNonModalCommandExecute));

    /// <summary>
    /// Gets the navigation service.
    /// </summary>
    /// <value>The navigation service.</value>
    protected INavigationService NavigationService { get; }

    /// <summary>
    /// Initializes a new instance of the <see cref="AppMapviewmodelBase"/> class.
    /// </summary>
    /// <param name="navigationService">The navigation service.</param>
    /// <exception cref="System.ArgumentNullException">navigationService</exception>
    protected AppMapviewmodelBase(INavigationService navigationService)
    {
        if (navigationService == null)
        {
            throw new ArgumentNullException(nameof(navigationService));
        }
        this.NavigationService = navigationService;

        Connectivity.ConnectivityChanged += Connectivity_ConnectivityChanged;
        IsNotConnected = Connectivity.NetworkAccess != NetworkAccess.Internet;

     
    }



    void Connectivity_ConnectivityChanged(object sender,ConnectivityChangedEventArgs e)
    {
        if (e.NetworkAccess != NetworkAccess.Internet)
        {
            //NavigationService.NavigateAsync("NavigationPage/NoInternet");
        }

       IsNotConnected = e.NetworkAccess != NetworkAccess.Internet;
    }


    /// <summary>
    /// Determines whether this instance accepts being navigated away from.  This method is invoked by Prism before a navigation operation and is a member of IConfirmNavigation.
    /// </summary>
    /// <param name="parameters">The navigation parameters.</param>
    /// <returns><c>True</c> if navigation can continue,<c>False</c> if navigation is not allowed to continue</returns>
    public virtual bool CanNavigate(INavigationParameters parameters)
    {
        return true;
    }

    /// <summary>
    /// Determines whether this instance can execute the NavigateAbsoluteCommand.
    /// </summary>
    /// <param name="uri">The uri.</param>
    /// <returns><c>true</c> if this instance can execute NavigateAbsoluteCommand; otherwise,<c>false</c>.</returns>
    protected virtual bool CanNavigateAbsoluteCommandExecute(string uri)
    {
        return !String.IsNullOrEmpty(uri);
    }

    /// <summary>
    /// Determines whether this instance can execute the NavigateAbsoluteCommand.
    /// </summary>
    /// <param name="uri">The uri.</param>
    /// <returns><c>true</c> if this instance can execute NavigateAbsoluteCommand; otherwise,<c>false</c>.</returns>
    protected virtual bool CanNavigateCommandExecute(string uri)
    {
        return !String.IsNullOrEmpty(uri);
    }

    /// <summary>
    /// Determines whether this instance can execute the NavigateModalCommand.
    /// </summary>
    /// <param name="uri">The uri.</param>
    /// <returns><c>true</c> if this instance can execute NavigateModalCommand; otherwise,<c>false</c>.</returns>
    protected virtual bool CanNavigateModalCommandExecute(string uri)
    {
        return !String.IsNullOrEmpty(uri);
    }

    /// <summary>
    /// Determines whether this instance can execute the NavigateNonModalCommand.
    /// </summary>
    /// <param name="uri">The uri.</param>
    /// <returns><c>true</c> if this instance can execute NavigateNonModalCommand; otherwise,<c>false</c>.</returns>
    protected virtual bool CanNavigateNonModalCommandExecute(string uri)
    {
        return !String.IsNullOrEmpty(uri);
    }

    /// <summary>
    /// <p>Invoked by Prism Navigation when the instance is removed from the navigation stack.</p>
    /// <p>Deriving class can override and perform any required clean up.</p>
    /// </summary>
    public virtual void Destroy()
    {
    }

    /// <summary>
    /// Navigates to the uri after creating a new navigation root. (Effectively replacing the Application MainPage.)
    /// </summary>
    /// <param name="uri">The uri text.</param>
    /// <returns>Task.</returns>
    protected virtual async void NavigateAbsoluteCommandExecute(string uri)
    {
        if (!CanNavigateAbsoluteCommandExecute(uri))
        {
            return;
        }
        if (!uri.StartsWith(RootUriPrependText))
        {
            uri = string.Concat(RootUriPrependText,uri);
        }
        await this.NavigationService.NavigateAsync(uri,null,false,false);
    }

    /// <summary>
    /// Navigates to the uri.
    /// </summary>
    /// <param name="uri">The uri text.</param>
    /// <returns>Task.</returns>
    protected virtual async void NavigateCommandExecute(string uri)
    {
        if (!CanNavigateCommandExecute(uri))
        {
            return;
        }
        await this.NavigationService.NavigateAsync(uri);
    }

    /// <summary>
    /// Navigates to the uri using a Modal navigation.
    /// </summary>
    /// <param name="uri">The uri text.</param>
    /// <returns>Task.</returns>
    protected virtual async void NavigateModalCommandExecute(string uri)
    {
        if (!CanNavigateModalCommandExecute(uri))
        {
            return;
        }
        await this.NavigationService.NavigateAsync(uri,useModalNavigation: true,animated:false);
    }

    /// <summary>
    /// Navigates to the uri using Non-Modal navigation.
    /// </summary>
    /// <param name="uri">The uri text.</param>
    /// <returns>Task.</returns>
    protected virtual async void NavigateNonModalCommandExecute(string uri)
    {
        if (!CanNavigateNonModalCommandExecute(uri))
        {
            return;
        }
        await this.NavigationService.NavigateAsync(uri,useModalNavigation: false,false);
    }

    /// <summary>
    /// Invoked by Prism immediately after the viewmodel has been created.
    /// </summary>
    /// <param name="parameters">The parameters.</param>
    public virtual void InitializeAsync(INavigationParameters parameters)
    {
        
    }

    /// <summary>
    /// Invoked by Prism after navigating away from viewmodel's page.
    /// </summary>
    /// <param name="parameters">The parameters.</param>
    public virtual void OnNavigatedFrom(INavigationParameters parameters)
    {
    }

    /// <summary>
    /// Invoked by Prism after navigating to the viewmodel's page.
    /// </summary>
    /// <param name="parameters">The parameters.</param>
    public virtual void OnNavigatedTo(INavigationParameters parameters)
    {
    }

    public virtual void  Initialize(INavigationParameters parameters)
    {
         
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)