繁体   English   中英

Xamarin/Tizen:执行 Navigation.PopAsync() 使应用程序崩溃

[英]Xamarin/Tizen: Executing Navigation.PopAsync() crashes the app

我有一个设置三个页面的导航页面。 第一个页面加载,用户必须从列表视图中选择一个选项,然后使用PushAsync()加载第二个页面。 此时,用户现在可以通过转动钟面在三个页面之间导航。 如果我在第二页上调用PopToRootAsync()它工作正常。 如果旋转钟面顺时针转动,它会通过PushAsync()加载第三页。

问题是如果我在第三页上调用PopAsync()或将第二页上的 PopToRootAsync( PopToRootAsync()更改为PopAsync() ,则应用程序崩溃。 我无法确定错误是什么,因为我只是遇到了分段错误,并且没有任何内容写入 Tizen 日志,这似乎表明它崩溃的原因。

PopAsync()是否有某种原因会导致这种情况? 我知道我看到了其他一些文章,如果MainPage未加载到NavigationPage中,可能会发生这种情况,但我正在这样做。 几天来,我一直在寻找东西并编写调试日志,但没有任何东西可以显示。 任何帮助将不胜感激。 谢谢!

应用程序.cs

public App()
{
     MainPage = new NavigationPage(new ServerSelectionPage());    
}

服务器选择.cs

private void ServerSelection_OnItemTapped(object sender, ItemTappedEventArgs args)
{
    App.SERVER = (Server)args.Item;
    Navigation.PushAsync(new ArrowsPage());
}

PageBase.cs

public async void Rotate(RotaryEventArgs args)
{
    Page _currentPage = Page.REMOTE_BUTTONS;

    if (this.GetType() == typeof(ButtonsPage))
        _currentPage = Page.REMOTE_BUTTONS;
    else if (this.GetType() == typeof(ArrowsPage))
        _currentPage = Page.REMOTE_ARROWS;
    else
        _currentPage = Page.SERVER_SELECTION;

    // When rotating (previous rotation is ongoing, do nothing)
    if (_rotating)
    {
        return;
    }

    _rotating = true;

    if (!(App.SERVER is null))
    {
        if (_currentPage == Page.SERVER_SELECTION)
        {
            if (args.IsClockwise)
                await Navigation.PushAsync(new ArrowsPage());
        }
        else if (_currentPage == Page.REMOTE_DIRECTIONAL)
        {
            if (args.IsClockwise)
                await Navigation.PushAsync(new ButtonsPage());
            else
                await Navigation.PopToRootAsync();
        }
        else
        {
            try
            {
                if (!args.IsClockwise)
                    await Navigation.PopAsync(); // This will crash the app
            }
            catch(Exception ex)
            {
                Log.Debug(ex.Message);
            }
        }
    }

    _rotating = false;
}

在阅读@vin 关于检查导航 object 是否为 null 的评论后,我突然想到它可能不是导航页面而是 RotaryFocusObject。 所以我改变了

 if (!args.IsClockwise)
    await Navigation.PopAsync();

 if (!args.IsClockwise)
 {
   RotaryFocusObject = null;
   await Task.Delay(300);
   await Navigation.PopAsync();
 }

它不再崩溃。 延迟是必要的,就像您在将 object 设置为 null 之后立即调用 PopAsync 一样,它有时仍会崩溃。

因此,显然,如果您弹出当前页面,则会导致错误,因为旋转拨盘的焦点仍设置为当前导航页面。 如果您使用Navigation.PopToRootAsync()为什么似乎不会发生此错误对我来说毫无意义。

Navigation.PopToRootAsync()Navigation.PopToRootAsync()导致 Pagerenderer 销毁, Rotate handler 属于 Page Renderer,如果 Pagerenderer 在属于 Pagerenderer 的Rotate Native Callback完成之前被删除,将会崩溃.

await Task.Delay()让返回本机回调。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM