Xamarin.forms Xamarin表单,使用BottomNavigationBar使调用出现两次

Xamarin.forms Xamarin表单,使用BottomNavigationBar使调用出现两次,xamarin.forms,bottomnavigationview,Xamarin.forms,Bottomnavigationview,我也在使用android实现底部导航栏(而不是旧的tablayout),问题是调用出现/消失的,如下所示: on出现 OnDisappearing on出现 我在appearing方法中调用我的ViewModel的LoadData()方法(负责从RESTAPI获取数据并填充视图),由于调用了两次,应用程序面临性能问题。另外,由于OnDisappearing在第一次OnAppearing之后调用,我无法使用bool来处理何时调用LoadData()。那么我该如何解决这个问题呢?不知道为什么会调用两

我也在使用android实现底部导航栏(而不是旧的tablayout),问题是调用出现/消失的
如下所示:

  • 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
    inside
    OnAppearing
    ,就像Android
    onResume()
    。在这种情况下,如果刷新视图,它可能会在出现时回忆起来。因此,我可能会建议进行布尔检查和页面类型检查(如果您要求我,这只是一种良好的做法。)因此,在'e loaddata方法中,将布尔标志设置为true,并将其称为类似“viewFirstRun”的名称,并在if语句中的on-exeching方法中对其进行检查。这样,在出现时只会运行您的相关代码一次,并且只有在第一次显示页面时才会运行。我很高兴尝试这种方法来简化角色,但它不起作用!在这两种情况下,if语句都是
    true
    ViewModel.LoadData()中是否有任何内容;这需要当前视图重新呈现自身?是的,因为用户可以转到内部视图并更改我在该页面上显示的内容,我必须调用
    LoadData
    inside
    OnAppearing
    ,就像Android
    onResume()
    。在这种情况下,如果刷新视图,它可能会在出现时回忆起来。因此,我可能会建议进行布尔检查和页面类型检查(如果您要求我,这只是一种良好的做法。)因此,在'e loaddata方法中,将布尔标志设置为true,并将其称为类似“viewFirstRun”的名称,并在if语句中的on-exeching方法中对其进行检查。这样,出现时只会运行一次相关代码,并且只有在页面第一次显示时才会运行。