我在 MAUI 应用程序中遇到了一个问题,很少情况下会出现未处理的 NavigationFailed 异常。我有一个主视图,它导航到一个带有以下内容的次要页面:
await Shell.Current.GoToAsync($"{nameof(AddCollectionPage)}", true, new Dictionary<string, object>
{
{"Contracts", queryStringBuilder.ToString() }
});
然后在第二个页面中有一个按钮,使用以下代码返回上一页:
await Shell.Current.GoToAsync("../");
现在这个程序运行得很好,也许有1000次中有999次没有问题... 但是偶尔会崩溃。在调试时,它会在App.g.i.cs文件的UnhandledException点处中断,代码如下:
UnhandledException += (sender, e) =>
{
if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
};
调用堆栈只包含4个条目 - 其中2个是外部代码,1个是我在App.g.i.cs中发布的位置,另一个是它调用shell导航的行。
这刚刚发生了,在代码中我调用Navigation从二级页面返回到主页面的“../”处。这是一个非常罕见的情况,但足够频繁以至于相当恼人。
当我将调用GoToAsync导致崩溃的行包装在try catch中并记录它捕获的异常时,我得到以下信息(错误和堆栈跟踪)。其中最后一行引用了我的代码部分调用GoToAsync,其他所有内容都是MAUI框架的东西。
System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL has been returned from a call to a COM component.
at WinRT.ExceptionHelpers.<ThrowExceptionForHR>g__Throw|20_0(Int32 hr)
at ABI.Microsoft.UI.Xaml.Controls.IFrameMethods.GoBack(IObjectReference _obj, NavigationTransitionInfo transitionInfoOverride)
at Microsoft.Maui.Handlers.ElementHandler.Invoke(String command, Object args)
at Microsoft.Maui.Controls.ShellSection.OnPopAsync(Boolean animated)
at Microsoft.Maui.Controls.ShellSection.PrepareCurrentStackForBeingReplaced(ShellNavigationRequest request, ShellRouteParameters queryData, IServiceProvider services, Nullable`1 animate, List`1 globalRoutes, Boolean isRelativePopping)
at Microsoft.Maui.Controls.ShellSection.GoToAsync(ShellNavigationRequest request, ShellRouteParameters queryData, IServiceProvider services, Nullable`1 animate, Boolean isRelativePopping)
at Microsoft.Maui.Controls.ShellNavigationManager.GoToAsync(ShellNavigationParameters shellNavigationParameters, ShellNavigationRequest navigationRequest)
at BlurFarm.ViewModels.AddCollectionPageViewModel.SelectCollection(Collection collection)