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

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

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

加载第三页

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

PopAsync() 会导致这种情况吗?我知道我看过其他一些文章,如果 MainPage 未加载到 NavigationPage 中,可能会发生这种情况,但我正在这样做。几天来我一直在查看内容并编写调试日志,但没有任何结果。任何帮助将不胜感激。谢谢!

App.cs

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

ServerSelection.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关于检查Navigation对象是否为null的评论,突然想到可能不是Navigation页面而是RotaryFocusObject。所以我改变了

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

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

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

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

Navigation.PopToRootAsync()Navigation.PopToRootAsync() 导致页面渲染器被破坏,而 Rotate 处理程序属于页面渲染器, 如果页面渲染器在属于页面渲染器的 Rotate Native Callback 完成之前被删除,它将崩溃。

await Task.Delay() 让我们返回原生回调。