为什么 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 中,请根据需要进行调整。