[英]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.