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()
让我们返回原生回调。
我有一个导航页,设置了三个页面。第一页加载,用户必须从列表视图中选择一个选项,然后它加载第二页 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()
让我们返回原生回调。