是否有 Xamarin 导航的替代方案?

问题描述

我使用 Xamarin.Forms 开发一个 Android 应用程序。我在导航方面遇到了一些问题。

当我使用 Navigation.PushAsync(new ContentPage()); 时,我的导航流程会创建 bucles。当我按下返回时,我会重新访问那些无法访问的页面。比如我推送这个页面

登录(前往)> 菜单(前往)> CloseSession(前往)> 登录

当我点击Android的返回按钮时,流程是这样的:

Login(go)>Menu(go)>CloseSession(go)>Login(goback)>CloseSession(goback)>Menu(goback)>Login

不想退出应用程序:

登录(go)> 菜单(go)> CloseSession(go)> 登录(goback)> 应用关闭

我知道如果我使用 Navigation.PopAsync();,最后一个推送页面会从导航堆栈中删除,但对我来说看起来很棘手。是否有 Xamarin 导航的替代方案?有什么方法可以创建导航页面,避免将它们添加到堆栈中?

解决方法

您不应该使用这样的导航。某些表单(尤其是登录),应在完成后弹出。

  1. 推送登录表单
  2. 用户完成登录
  3. 弹出登录表单
  4. 决定接下来应该推送哪个表单。
,

在您的场景中,我建议您使用 Modal Pages 来显示登录页面。

它会创建额外的模态堆栈,不会影响原始堆栈。

当用户完成登录后,弹出登录页面。


流程

  • 在应用中将 NavigationPage(root page : Main) 设置为 MainPage。
  • 使用 PushModalAsync 显示登录页面。
  • 完成登录
  • 使用 PopModalAsync 关闭登录页面。
,

我相信您要做的是“操纵导航堆栈”。

  • 如果您不希望某个页面出现在导航堆栈中,您可以在使用 Navigation.RemovePage(page) 导航离开该页面后立即将其删除。 您可以传递该页面的已保存引用,或在 Navigation.NavigationStack 中查找,如果它是已知场景(您要删除的页面的已知导航堆栈索引),您可以执行以下操作:

    Navigation.RemovePage(Navigation.NavigationStack[index]);

  • 或者您可以使用 InsertPageBefore() 后跟 PopAsync(),如 navigation docs 示例所示:

这些方法支持自定义导航体验,例如在成功登录后用新页面替换登录页面。以下代码示例演示了这种情况:

async void OnLoginButtonClicked(object sender,EventArgs e)
{
  if (IsValid)
  {
    Navigation.InsertPageBefore(new MainPage (),this);
    await Navigation.PopAsync();
  }

 else
 {
    // Login failed
  }
}
,

从任何活动页面,您都可以使用

打开另一个页面
StartActivity(typeof(YourView));

当该页面完成后,它会将您返回到您从中调用它的页面。