首页 > 解决方案 > 如何根据当前向用户显示的页面有条件地 PopAsync

问题描述

在我的应用程序的同一页面中,用户可以发送两个 websocket 请求。然后我得到两个 websocket 响应。在每个响应中,我都会从导航堆栈中弹出页面。这是在他们的个人资料页面中,他们可以在其中编辑一些基本信息或更改密码。希望他们通常只会做一个,但如果他们两个都做,然后点击保存,它会弹出两次页面。

我一直在尝试检查当前页面,如果他们仍然在个人资料页面上继续弹出它,但如果他们没有然后跳过弹出。

似乎 popasync 实际上并没有从堆栈中删除页面,因为我会在之后将导航堆栈调用到列表中进行检查,并且它仍然存在。我尝试检查堆栈中的任何页面是否是配置文件页面,然后将其弹出。如果堆栈中有多个实例,这仍然可能是草率的,但它至少会让我朝着正确的方向前进。

我还尝试使用 MessagingCenter 将其带回后面的代码,但这也没有奏效。

这里的主要问题是我只想弹出用户当前正在查看的页面。

如果有人能指出我正确的方向,那将不胜感激。

else if (root.payload?.data?.updateUserFields != null)
                {
                    DabGraphQlUpdateUserFields fields = root.payload.data.updateUserFields;

                    dbSettings.StoreSetting("Email", fields.email);
                    dbSettings.StoreSetting("FirstName", fields.firstName);
                    dbSettings.StoreSetting("LastName", fields.lastName);

                    GlobalResources.WaitStop();
                    var UserName = GlobalResources.GetUserName().Split(' ');
                    GuestStatus.Current.UserName = GlobalResources.GetUserName();
                    Device.BeginInvokeOnMainThread(() => { Application.Current.MainPage.DisplayAlert("Success", "User profile information has been updated", "OK"); ; });
                    DabProfileManagementPage profilePage = new DabProfileManagementPage();
                    Device.BeginInvokeOnMainThread(() =>
                    {
                        if (Application.Current.MainPage.Navigation.NavigationStack.Any(p => p is DabProfileManagementPage))
                        {
                            var existingPagess = Application.Current.MainPage.Navigation.NavigationStack.ToList();
                            Application.Current.MainPage.Navigation.PopAsync();
                            var _lastPage = Application.Current.MainPage.Navigation.NavigationStack.LastOrDefault();
                            Application.Current.MainPage.Navigation.RemovePage(_lastPage);
                            var existingPages = Application.Current.MainPage.Navigation.NavigationStack.ToList();
                        }
                    });

                    //Device.BeginInvokeOnMainThread(() => { Application.Current.MainPage.Navigation.PopAsync(); });
                }
                else if (root.payload?.data?.updatePassword != null)
                {
                    GlobalResources.WaitStop();
                    if (root.payload.data.updatePassword == true)
                    {
                        Device.BeginInvokeOnMainThread(() => { Application.Current.MainPage.DisplayAlert("Success", "Your password has been updated", "OK"); ; });
                        Device.BeginInvokeOnMainThread(() =>
                        {
                            if (Application.Current.MainPage.Navigation.NavigationStack.Any(p => p is DabProfileManagementPage))
                            {
                                var existingPagess = Application.Current.MainPage.Navigation.NavigationStack.ToList();
                                Application.Current.MainPage.Navigation.PopAsync();
                                var _lastPage = Application.Current.MainPage.Navigation.NavigationStack.LastOrDefault();
                                Application.Current.MainPage.Navigation.RemovePage(_lastPage);
                                var existingPages = Application.Current.MainPage.Navigation.NavigationStack.ToList();
                            }
                        });

                        //Device.BeginInvokeOnMainThread(() => { Application.Current.MainPage.Navigation.PopAsync(); });
                    }
                }

标签: c#xamarinxamarin.forms

解决方案


正如 Jason 指出的那样,我只是添加了 int 类型的变量,并在发生弹出后增加了它,并在它尝试超过 2 时将其重置。一旦用户单击以再次打开页面,我也将其重置为 0。唯一不应该经常发生的问题是,如果用户尝试在不离开页面的情况下第三次更改信息。不会发生流行音乐。我考虑过添加一个计时器,但之前我的应用程序会被计时器弄得一团糟,所以我选择暂时保持原样。希望无论用户决定点击该功能多少次,我都能找到一种每次弹出一次的方法。

                else if (root.payload?.data?.updateUserFields != null)
                {
                    DabGraphQlUpdateUserFields fields = root.payload.data.updateUserFields;

                    dbSettings.StoreSetting("Email", fields.email);
                    dbSettings.StoreSetting("FirstName", fields.firstName);
                    dbSettings.StoreSetting("LastName", fields.lastName);

                    GlobalResources.WaitStop();
                    var UserName = GlobalResources.GetUserName().Split(' ');
                    GuestStatus.Current.UserName = GlobalResources.GetUserName();
                    Device.BeginInvokeOnMainThread(() => { Application.Current.MainPage.DisplayAlert("Success", "User profile information has been updated", "OK"); ; });
                    if (popRequests < 1)
                    {
                        popRequests = popRequests + 1;
                        Device.BeginInvokeOnMainThread(() => { Application.Current.MainPage.Navigation.PopAsync(); });
                    }
                    else
                        popRequests = 0;
                }
                else if (root.payload?.data?.updatePassword != null)
                {
                    GlobalResources.WaitStop();
                    if (root.payload.data.updatePassword == true)
                    {
                        Device.BeginInvokeOnMainThread(() => { Application.Current.MainPage.DisplayAlert("Success", "Your password has been updated", "OK"); ; });
                        if (popRequests < 2)
                        {
                            popRequests = popRequests + 1;
                            Device.BeginInvokeOnMainThread(() => { Application.Current.MainPage.Navigation.PopAsync(); });
                        }
                        else
                            popRequests = 1;
                    }
                }

推荐阅读