c# - 如何根据当前向用户显示的页面有条件地 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(); });
}
}
解决方案
正如 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;
}
}
推荐阅读
- r - 为 GitHub 操作安装 lintr
- c# - How do I create a Windows installer for .net core web application that runs as a service?
- android - How can i stop exoplayer in viewpager2 on swipe
- reactjs - How can I pass values from component from A to B component in react?
- html - 为什么 form method=post 重置数据实例?
- asp.net-core - 如何从 .net 核心中的 jwt 令牌中获取用户的 id 或如何从自定义授权属性返回值?
- plotly - 在 Plotly 地理图中将海洋颜色设置为透明
- python - 让子类中的方法在其父签名中接受参数的子类
- docker - 启动 Docker Desktop 时从 IntelliJ 弹出“无法执行命令”
- python-3.x - python中的函数消耗优化