我有一个Xamarin项目。当我在UWP中运行OnAppearing
时,首先触发一次,然后加载登录页面。成功登录后,我的主页再次触发OnAppearing
,我将数据加载到我的ViewModel中。
然而,如果我在Android中运行项目,OnAppearing
只触发一次-当主页初始加载时。
protected override async void OnAppearing()
{
if (!App.IsUserLoggedIn)
{
await App.NavigationService.NavigateModalAsync(PageNames.LoginPage, false);
}
else
{
((SchedulerViewModel)Schedule.BindingContext).LoadData();
}
base.OnAppearing();
}
为什么Android只启动一次?还是UWP行为不端的一方?
注意:NavigationService
不是一个标准的Xamarin Forms类。我认为它是建立在Page.Navigation.PushModalAsync和PopModalAsync之上的。
这是Android上Modal Stack的文档行为:
从Modal Stack弹出页面:
当PopModalAsync被调用时,会发生以下事件:…被返回的页面有它的onappear覆盖调用,提供底层平台不是Android。
注意:这似乎取决于Android的API版本。我刚刚在API 30上测试了它,Android做了弹出模态页面时触发onappear
代替onappear中的代码,我会这样解决它:
在App.xaml.cs
中,而不是:
MainPage = new MainPage();
:
if (!App.IsUserLoggedIn)
MainPage = new LoginPage();
else
MainPage = new MainPage();
然后当LoginPage完成,而不是弹出模式,做:
Application.Current.MainPage = new MainPage();
注意:如果这些是NavigationPage或AppShell中的页面,请根据需要调整。