Prism for Xamarin.Forms:无法从导航栈移除页面的问题
嘿,我来帮你搞定这个Prism导航的问题!结合你描述的场景和报错信息,咱们一步步拆解:
你的需求很明确:从ViewB跳转到ViewC后,点击返回直接回到ViewA(跳过ViewB)。你尝试用../ViewC的相对导航方式触发报错,这个问题大概率是Prism 7.2版本中处理这种相对导航+页面移除的逻辑存在bug——从错误栈的NullReferenceException能看出来,框架在RemovePagesFromNavigationPage方法里遇到了未初始化的对象。
下面给你两种可靠的替代实现方式:
方法1:用内置导航参数自动移除前一页
Prism本身提供了RemovePreviousPage导航参数,你在ViewB跳转到ViewC时传递这个参数,框架会自动把ViewB从导航栈中移除,完美满足你的需求:
var parameters = new NavigationParameters(); // 告诉Prism导航后移除上一个页面(也就是ViewB) parameters.Add(NavigationParameterKeys.RemovePreviousPage, true); await _navigationService.NavigateAsync("ViewC", parameters);
这种方式最简洁,完全符合Prism的设计规范,不需要手动操作导航栈。
方法2:手动移除导航栈中的ViewB
如果方法1因为版本兼容问题不生效,你可以在成功跳转到ViewC后,手动从导航栈里删掉ViewB:
var navigationResult = await _navigationService.NavigateAsync("ViewC"); if (navigationResult.Success) { // 从导航栈中找到ViewB实例 var viewBPage = _navigationService.NavigationStack.LastOrDefault(p => p.GetType() == typeof(ViewB)); if (viewBPage != null) { await _navigationService.RemovePageAsync(viewBPage); } }
注意一定要等导航成功后再移除页面,避免破坏导航栈的结构。
为什么../ViewC会报错?
你的导航路径/NavigationPage/ViewA/ViewB是完全正确的,但Prism 7.2的相对导航逻辑在处理../ViewC时,会先尝试回退到ViewA,再导航到ViewC,同时试图移除ViewB,可惜框架内部的页面移除逻辑在这里出了空引用问题。这个bug在后续的Prism 8.x及更高版本中已经被修复,如果你有条件升级框架版本,也能解决这个问题。
验证导航栈是否正确
无论用哪种方法,你都可以在ViewC里调用下面的代码确认导航栈结构:
var currentPath = _navigationService.GetNavigationUriPath(); // 正确的路径应该是 /NavigationPage/ViewA/ViewC
内容的提问来源于stack exchange,提问作者jbachelor

