Xamarin.forms Xamarin表单,使用BottomNavigationBar使调用出现两次
我也在使用android实现底部导航栏(而不是旧的tablayout),问题是调用出现/消失的Xamarin.forms Xamarin表单,使用BottomNavigationBar使调用出现两次,xamarin.forms,bottomnavigationview,Xamarin.forms,Bottomnavigationview,我也在使用android实现底部导航栏(而不是旧的tablayout),问题是调用出现/消失的,如下所示: on出现 OnDisappearing on出现 我在appearing方法中调用我的ViewModel的LoadData()方法(负责从RESTAPI获取数据并填充视图),由于调用了两次,应用程序面临性能问题。另外,由于OnDisappearing在第一次OnAppearing之后调用,我无法使用bool来处理何时调用LoadData()。那么我该如何解决这个问题呢?不知道为什么会调用两
,
如下所示:
on出现
OnDisappearing
on出现
我在appearing方法中调用我的
ViewModel
的LoadData()
方法(负责从RESTAPI获取数据并填充视图),由于调用了两次,应用程序面临性能问题。另外,由于OnDisappearing
在第一次OnAppearing
之后调用,我无法使用bool
来处理何时调用LoadData()
。那么我该如何解决这个问题呢?不知道为什么会调用两次,但您可以使用这个技巧。在类变量中存储OnAppearing的时间戳。当OnAppearing被调用时,检查上次调用它的时间,如果时间(比方说)小于10秒,则不要执行任何操作。不确定为什么会调用两次,但您可以使用该技巧。在类变量中存储OnAppearing的时间戳。调用OnAppearing时,请检查上次调用它的时间,如果在Xamarin.Android中的时间(比方说)小于10秒,则不执行任何操作,如果您在推到导航堆栈上的任何页面中覆盖OnAppearing(),则不管该方法是否会触发当前最可见的视图。您应该在OnAppearing()中添加一个检查,检查您的视图是否位于堆栈顶部,如果它不是简单地什么都不做的话
protected override void OnAppearing()
{
var Page = Navigation.NavigationStack.Last();
if (Page.GetType() == typeof(NAMEOFPAGECLASSYOURON))
{
// Do what you want to do only if your on this page.
}
}
在Xamarin.Android中,如果在推送到导航堆栈上的任何页面中重写OnAppearing(),则不管该方法将触发的视图是否是当前最可见的视图。您应该在OnAppearing()中添加一个检查,检查您的视图是否位于堆栈顶部,如果它不是简单地什么都不做的话
protected override void OnAppearing()
{
var Page = Navigation.NavigationStack.Last();
if (Page.GetType() == typeof(NAMEOFPAGECLASSYOURON))
{
// Do what you want to do only if your on this page.
}
}
我很高兴尝试这种方法来简化角色,但它不起作用!在这两种情况下,if语句都是
true
ViewModel.LoadData()中是否有任何内容;这需要当前视图重新呈现自身?是的,因为用户可以转到内部视图并更改我在该页面上显示的内容,我必须调用LoadData
insideOnAppearing
,就像AndroidonResume()
。在这种情况下,如果刷新视图,它可能会在出现时回忆起来。因此,我可能会建议进行布尔检查和页面类型检查(如果您要求我,这只是一种良好的做法。)因此,在'e loaddata方法中,将布尔标志设置为true,并将其称为类似“viewFirstRun”的名称,并在if语句中的on-exeching方法中对其进行检查。这样,在出现时只会运行您的相关代码一次,并且只有在第一次显示页面时才会运行。我很高兴尝试这种方法来简化角色,但它不起作用!在这两种情况下,if语句都是true
ViewModel.LoadData()中是否有任何内容;这需要当前视图重新呈现自身?是的,因为用户可以转到内部视图并更改我在该页面上显示的内容,我必须调用LoadData
insideOnAppearing
,就像AndroidonResume()
。在这种情况下,如果刷新视图,它可能会在出现时回忆起来。因此,我可能会建议进行布尔检查和页面类型检查(如果您要求我,这只是一种良好的做法。)因此,在'e loaddata方法中,将布尔标志设置为true,并将其称为类似“viewFirstRun”的名称,并在if语句中的on-exeching方法中对其进行检查。这样,出现时只会运行一次相关代码,并且只有在页面第一次显示时才会运行。