如何解决在 Xamarin Prism 中,如果说用户已经登录,你如何重定向
我的过程很简单,但在 xamarin 中似乎非常复杂。
我的所有页面都需要“重定向”机制,主要是因为已登录/超时(API 刷新令牌等) 所以无论在下面的问题中有效,都将解决我所有的问题。 (这就是为什么我不在 App.cs 中进行以下登录检查)
Loginviewmodel 上的以下代码在发生这种情况时表现得非常奇怪:
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 举报,一经查实,本站将立刻删除。