MAUI:GoToAsync()和PushAsync()之间导航页面有什么区别?

4

我正在尝试学习在 MAUI 应用程序和 MVVM 中导航页面的最佳方法。

我已经看到 Microsoft 的示例中,使用 PushAsync() 是默认的方式,但后来我发现也可以使用 Shell.Current.GoToAsync() 进行导航。

这两者之间有什么区别?还是它们是互补的?


请提供您正在查看的示例链接。PushAsyncNavigationPage示例中使用。ShellNavigationPage是两种不同的布局,每种布局都有自己的导航API。默认情况下,Maui的App.xaml.cs会执行MainPage = new AppShell();。因此,它使用的是AppShell,也就是Shell。 - ToolmakerSteve
2个回答

5

我创建了一个示例来测试PushAsync()GoToAsync()

GoToAsync()根据路由在当前页面和目标页面之间导航。因此,它不会创建多个相同页面的实例。一个页面只有一个实例。如果你使用GoToAsync()导航,例如从Page1到Page2,你不能使用GoToAsync()返回到Page1。你只能使用GoToAsync("..")返回到Page1。

但是对于PushAsync(),你可以使用PushAsync(new Page2())来创建多个相同页面的实例。导航堆栈将是Page1 -> Page2 -> Page1 -> Page2...

因此,GoToAsync()类似于具有单例页面的PushAsync()。当你使用GoToAsync()时,需要注册路由。

此外,当你使用GoToAsync()导航时,有一些限制,例如你只能传递集合数据到下一页。但是当你使用PushAsync()时,你可以传递几乎所有类型的数据到目标页面。

总的来说,PushAsync()易于使用并传递数据,而GoToAsync()具有更好的功能,但需要更多细节。


但是使用goToAsync(),如果您在MauiProgram类中注册服务构建器builder.Services.AddTransient(),则每次导航都可以获得新实例。注册是使用依赖注入进行页面实例化的一种方式。 - Álvaro García
1
但是当我测试 goToAsync() 时,它不会创建多个相同页面的实例。 - Liyun Zhang - MSFT
讲解得很清楚,谢谢。 - Samuel B.

0

我认为PushAsync()在Shell导航中已不再可用,您应该使用GotoAsync()。

但是PushAsync与将页面堆叠在其他页面上相关联,因此您稍后可以弹出并导航回该页面。 GotoAsync()使用相对路径进行导航,您可以在此处查看文档:link


1
是的,这是我通过一些代码示例意识到的。如果我使用PushAsync()并点击箭头返回到上一页,由于页面堆栈,我会回到上一页。如果我在使用GoToAsync()时做同样的操作,我会回到根页面。但我猜当我在AppShell文件中设置路由时,这个问题可以解决。 - Álvaro García

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