Maui shell导航失败 - 稀有复现

4

我在 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)

我怀疑可能存在一些Maui定时错误。“无调试器运行”。当没有调试器时,代码即时编译,运行速度更快。仍然会有失败的情况吗? - ToolmakerSteve
如果有帮助的话,我在没有调试器的发布模式下遇到了相同的崩溃 @ToolmakerSteve - pingu2k4
我添加了更详细的堆栈跟踪,当使用try catch捕获调用GoToAsync时给出。 - pingu2k4
1个回答

0

看起来确实像是Maui的一个bug。

  • 我建议创建一个公共的github repo,包含一个简单的项目,只有足够的代码运行和显示问题。从Maui模板创建一个新项目,并保持两个页面简单。还会发生吗?

  • 看看这个hack是否可以避免这个问题:

MainThread.BeginInvokeOnMainThread(async () =>
{
   await Task.Delay(200);
   await Shell.Current.GoToAsync("../");
}

这样做有两个作用:

  1. 让按钮方法在执行任何操作之前返回。
  2. 引入了轻微的延迟。

我的想法是,Maui有时处于“未准备好”执行GoToAsync的状态。我没有心理图片来解释这种情况,但值得一试。


谢谢你。公开仓库简单重现的问题在于,我几乎从没见过这种情况,所以很难确定确切的条件,可能需要很长时间才能验证特定仓库是否存在问题。目前我只在某些测试应用中经常遇到这个问题。最近几次似乎都是使用 "../" 向后导航时出现的,而我记得之前好像没有出现向前导航的情况...不过还是感谢你提供的代码。 - pingu2k4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接