为什么 OnAppearing 不会在 Android 中每次都触发
Why does OnAppearing not fire every time in Android
我有一个 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 class。我假设它是建立在 Page.Navigation.PushModalAsync 和 PopModalAsync.
之上的
这是模态堆栈在 Android 上记录的行为:
Popping Pages from the Modal Stack:
When PopModalAsync is invoked, the following events occur:
...
The page being returned to has its OnAppearing override invoked, provided that the underlying platform isn't Android.
注意:它似乎取决于 Android 的 API 版本。我刚刚在 API 30 上对其进行了测试,当模式页面弹出时,Android did 再次触发 OnAppearing。
而不是 OnAppearing 中的代码,我会这样解决它:
在App.xaml.cs
中,而不是:
MainPage = new MainPage();
做:
if (!App.IsUserLoggedIn)
MainPage = new LoginPage();
else
MainPage = new MainPage();
然后当 LoginPage 完成时,不要弹出模式,而是:
Application.Current.MainPage = new MainPage();
注意:如果这些页面位于 NavigationPage 或 AppShell 中,请根据需要进行调整。
我有一个 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 class。我假设它是建立在 Page.Navigation.PushModalAsync 和 PopModalAsync.
这是模态堆栈在 Android 上记录的行为:
Popping Pages from the Modal Stack:
When PopModalAsync is invoked, the following events occur: ... The page being returned to has its OnAppearing override invoked, provided that the underlying platform isn't Android.
注意:它似乎取决于 Android 的 API 版本。我刚刚在 API 30 上对其进行了测试,当模式页面弹出时,Android did 再次触发 OnAppearing。
而不是 OnAppearing 中的代码,我会这样解决它:
在App.xaml.cs
中,而不是:
MainPage = new MainPage();
做:
if (!App.IsUserLoggedIn)
MainPage = new LoginPage();
else
MainPage = new MainPage();
然后当 LoginPage 完成时,不要弹出模式,而是:
Application.Current.MainPage = new MainPage();
注意:如果这些页面位于 NavigationPage 或 AppShell 中,请根据需要进行调整。