【问题标题】:Navigation Stack Destroyed after onResume()?导航堆栈在 onResume() 后被销毁?
【发布时间】:2020-01-31 18:11:30
【问题描述】:

我在我的应用中使用 onResume() 时遇到了奇怪的体验

这是一个小屏幕录像(不知道如何在此处发布) https://vimeo.com/387615558?ref=em-share

这是一个重新创建问题的示例项目 https://github.com/Lirian21/SampleApp

我让断点停止,我让方法运行,但由于某种原因,它实际上并没有弹出到根目录,

如果我确实让导航真正起作用,它只会导航到死页,应用程序就会冻结。 我实际上不确定如何处理 onResume() atm,我唯一需要做的是它需要检查是否有连接,如果有连接,它应该只是转到主页,我更喜欢如果它只是从中断的地方继续,但不确定它是如何工作的。

protected override void OnResume()
{
    try
    {
        MakeWebRequest();
        if (IsConnected != true)
        {
             MainPage = new NoInternet();
        }
        else
        {
               //base.OnResume();
            var nav = MainPage.Navigation;

            nav.PopToRootAsync(true);

            nav.PushAsync(new Home("XXXX"));
        }

    }
    catch (IOException ex)
    {

        Crashes.TrackError(ex);
    }

}

public partial class Home : MasterDetailPage, INotifyPropertyChanged
public App()
{
    InitializeComponent();
    MakeWebRequest();

    try
    {

        MainPage = new NavigationPage(new Home("XXXX"));
    }
 }

我的手机上也没有启用销毁活动的设置

我在日志天气 onResume()、OnStart() 等中找到了一个常量,但我似乎无法找到错误的含义

[HwSecImmHelper] mSecurityInputMethodService is null

更新:

我发现如果我使用产品上的按钮导航,然后使用主详细信息导航,应用程序不会像我显示的那样崩溃

所以只有当我在恢复后直接使用主从页面导航时应用程序才会崩溃

【问题讨论】:

  • 我对 Xamarin 不太熟悉,但您必须调用 onResume() 的超类实现。您没有在此处执行此操作(除非 Xamarin 为您执行此操作)。
  • 添加了一个指向正在发生的事情的短片的链接,据我了解,这就是base.OnResume(); 的用途,但结果是一样的
  • 去掉 nav.PushAsync(new Home("XXXX")); 会起作用吗?为什么在 PopToRootAsync 后得到一个 HomePage 时要推送到一个新的 HomePage。
  • 我刚刚发布了我使用的所有内容,无论我是否只是推送到 Root,结果都是一样的,如果我推送新家相同,除了尝试捕获同样的事情,不知道发生了什么,但我正在使用 PoptoRoot 清除想要的堆栈,然后导航到我所在的页面,但决定先解决这个问题
  • 您能否提供一个可以重现此问题的示例项目?

标签: c# xamarin.forms android-lifecycle


【解决方案1】:

您只是缺少 async+ await 关键字。

如果您有兴趣了解我们为什么需要 asyncawait 关键字,我建议您观看我最近在 async/await 上进行的演示,解释它在 .NET 中的工作原理:https://www.youtube.com/watch?v=J0mcYVxJEl0

protected override async void OnResume()
{
    base.OnResume();

    try
    {
        MakeWebRequest();

        if (IsConnected != true)
        {
             MainPage = new NoInternet();
        }
        else
        {
            await MainPage.Navigation.PopToRootAsync(true);

            await MainPage.Navigation.PushAsync(new Home("XXXX"));
        }

    }
    catch (IOException ex)
    {
        Crashes.TrackError(ex);
    }
}

【讨论】:

  • 啊,我多么希望这能为我解决,但是结果是一样的,我启动了应用程序,但是第二次导航它只是导航到一个空白的“死”页面,应用程序是基本上被杀了,我会带你去看那个演示文稿,另外请注意我尝试改变我在这里使用的导航
  • 我也没有让它真正导航到 noInternet 视图,所以我不确定发生了什么
猜你喜欢
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多