Android fragments Xamarin Android片段在ViewModel就绪之前显示视图

Android fragments Xamarin Android片段在ViewModel就绪之前显示视图,android-fragments,asynchronous,xamarin,xamarin.android,mvvmcross,Android Fragments,Asynchronous,Xamarin,Xamarin.android,Mvvmcross,我对等待异步方法有问题。我有一个片段(SalesFragment),它包含两个片段(FirstSalesFragment和SecondSalesFragment)的TabLayout。当我展示SalesFragment时,在TableLayout中选择了FirstSalesFragment,我在ViewModel中有一个异步方法,它调用API并给我一些数据。但问题是在FirstSalesFragment中,我有Microcharts布局,我想在那里显示图表,但主要问题是我的图表条目来自Api的异

我对等待异步方法有问题。我有一个片段(SalesFragment),它包含两个片段(FirstSalesFragment和SecondSalesFragment)的TabLayout。当我展示SalesFragment时,在TableLayout中选择了FirstSalesFragment,我在ViewModel中有一个异步方法,它调用API并给我一些数据。但问题是在FirstSalesFragment中,我有Microcharts布局,我想在那里显示图表,但主要问题是我的图表条目来自Api的异步方法,OnCreateView方法只是不等待ViewModel中的异步方法

我的FirstSales视图刚刚显示,但图表为空,因为OnCreateView不等待条目。。。我尝试了ActivityCreated或OnStart方法,但它是相同的

我的SalesFragment

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            _view = base.OnCreateView(inflater, container, savedInstanceState);

            var viewPager = _view.FindViewById<ViewPager>(Resource.Id.viewpager);
            if (viewPager != null)
            {
                var fragments = new List<MvxViewPagerFragmentInfo>
                {
                    new MvxViewPagerFragmentInfo(ViewModel.FirstSalesTab, typeof(FirstSalesFragment), typeof(FirstSalesViewModel)),
                    new MvxViewPagerFragmentInfo(ViewModel.SecondSalesTab, typeof(SecondSalesFragment), typeof(SecondSalesViewModel))
                };

                viewPager.Adapter = new MvxCachingFragmentStatePagerAdapter(Activity, ChildFragmentManager, fragments);
            }

            var tabLayout = _view.FindViewById<TabLayout>(Resource.Id.tabs);
            tabLayout.SetupWithViewPager(viewPager);

            return _view;
        }
public class FirstSalesFragment : BaseFragment<FirstSalesViewModel>
    {
        protected override int FragmentId => Resource.Layout.fragment_firstsales;
        private View _view;
        private ChartView _chartView;

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            _view = base.OnCreateView(inflater, container, savedInstanceState);
            _chartView = _view.FindViewById<ChartView>(Resource.Id.chartView);

            if (_chartView != null)
            {
                InitializeChart();
            }

            return _view;
        }



        private void InitializeChart()
        {
            var tempEntries = ViewModel.Entries;

            if (tempEntries == null || tempEntries.Count == 0)
            {
                _chartView.Chart = null;
                return;
            }

              var tempChart = new LineChart
                {
                    Entries = tempEntries,
                    LineMode = LineMode.Straight,
                    LineSize = 5,
                    LabelTextSize = 25,
                    AnimationDuration = new TimeSpan(0, 0, 5),
                    BackgroundColor = SKColor.Parse("#EEEEEE")
                };

                _chartView.Chart = tempChart;
        }
    }
public override视图OnCreateView(布局、充气机、视图组容器、Bundle savedInstanceState)
{
_视图=base.OnCreateView(充气机、容器、savedInstanceState);
var viewPager=\u view.findviewbyd(Resource.Id.viewPager);
if(viewPager!=null)
{
var fragments=新列表
{
新的MvxViewPagerFragmentInfo(ViewModel.FirstSalesTab,typeof(FirstSalesFragment),typeof(FirstSalesViewModel)),
新的MvxViewPagerFragmentInfo(ViewModel.SecondSalesTab,typeof(SecondSalesFragment),typeof(SecondSalesViewModel))
};
viewPager.Adapter=新的MvxCachingFragmentStatePagerAdapter(活动、子碎片管理器、碎片);
}
var tabLayout=\u view.findviewbyd(Resource.Id.tabs);
tabLayout.SetupWithViewPager(viewPager);
返回视图;
}
FirstSalesViewModel:

 public class FirstSalesViewModel : BaseViewModel
    {
        private readonly ISessionInfo _session;
        private readonly IInfoMessageReporter _infoMessageReporter;

        public FirstSalesViewModel()
        {
            _session = Mvx.Resolve<ISessionInfo>();
            _infoMessageReporter = Mvx.Resolve<IInfoMessageReporter>();
        }

        public async Task Initialize()
        {
        }

        public void Init()
        {
            Task.Run(InitializeHourlySales);
        }
        private async Task InitializeHourlySales()
        {
            // Call API async service... initialize Entries here....

        }

        private List<Entry> _entries;
        public List<Entry> Entries
        {
            get { return _entries; }
            set
            {
                _entries = value;
                RaisePropertyChanged(() => Entries);
            }
        }

    }
}
公共类FirstSalesViewModel:BaseViewModel { 专用只读ISessionInfo会话; 私有只读IInfoMessageReporter _infoMessageReporter; public FirstSalesViewModel() { _session=Mvx.Resolve(); _infoMessageReporter=Mvx.Resolve(); } 公共异步任务初始化() { } 公共void Init() { Task.Run(初始化hourlysales); } 专用异步任务初始化HourlySales() { //调用API异步服务…在此初始化项。。。。 } 私人名单(条目);; 公开列表条目 { 获取{return\u entries;} 设置 { _条目=值; RaisePropertyChanged(()=>条目); } } } } FirstSalesFragment

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            _view = base.OnCreateView(inflater, container, savedInstanceState);

            var viewPager = _view.FindViewById<ViewPager>(Resource.Id.viewpager);
            if (viewPager != null)
            {
                var fragments = new List<MvxViewPagerFragmentInfo>
                {
                    new MvxViewPagerFragmentInfo(ViewModel.FirstSalesTab, typeof(FirstSalesFragment), typeof(FirstSalesViewModel)),
                    new MvxViewPagerFragmentInfo(ViewModel.SecondSalesTab, typeof(SecondSalesFragment), typeof(SecondSalesViewModel))
                };

                viewPager.Adapter = new MvxCachingFragmentStatePagerAdapter(Activity, ChildFragmentManager, fragments);
            }

            var tabLayout = _view.FindViewById<TabLayout>(Resource.Id.tabs);
            tabLayout.SetupWithViewPager(viewPager);

            return _view;
        }
public class FirstSalesFragment : BaseFragment<FirstSalesViewModel>
    {
        protected override int FragmentId => Resource.Layout.fragment_firstsales;
        private View _view;
        private ChartView _chartView;

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            _view = base.OnCreateView(inflater, container, savedInstanceState);
            _chartView = _view.FindViewById<ChartView>(Resource.Id.chartView);

            if (_chartView != null)
            {
                InitializeChart();
            }

            return _view;
        }



        private void InitializeChart()
        {
            var tempEntries = ViewModel.Entries;

            if (tempEntries == null || tempEntries.Count == 0)
            {
                _chartView.Chart = null;
                return;
            }

              var tempChart = new LineChart
                {
                    Entries = tempEntries,
                    LineMode = LineMode.Straight,
                    LineSize = 5,
                    LabelTextSize = 25,
                    AnimationDuration = new TimeSpan(0, 0, 5),
                    BackgroundColor = SKColor.Parse("#EEEEEE")
                };

                _chartView.Chart = tempChart;
        }
    }
public类FirstSalesFragment:BaseFragment
{
受保护的覆盖int FragmentId=>Resource.Layout.fragment\u firstsales;
私有视图(u视图),;
私人海图(ChartView);;
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态)
{
_视图=base.OnCreateView(充气机、容器、savedInstanceState);
_chartView=\u view.FindViewById(Resource.Id.chartView);
如果(_chartView!=null)
{
InitializeChart();
}
返回视图;
}
私有void InitializeChart()
{
var tempEntries=ViewModel.Entries;
if(tempEntries==null | | tempEntries.Count==0)
{
_chartView.Chart=null;
返回;
}
var tempChart=新折线图
{
条目=临时条目,
LineMode=LineMode.直线,
线条尺寸=5,
LabelTextSize=25,
AnimationDuration=新的时间跨度(0,0,5),
BackgroundColor=SKColor.Parse(“#EEEEEE”)
};
_chartView.Chart=tempChart;
}
}

在支持使用异步的OnResume中调用异步代码

我稍微修改了您的代码示例,并在FirstSalesFragment的OnResume()中调用了ViewModel.Init()

FirstSalesViewModel 第一段
。。。
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包保存状态)
{
_视图=base.OnCreateView(充气机、容器、savedInstanceState);
_chartView=\u view.FindViewById(Resource.Id.chartView);
返回视图;
}
公共异步重写void OnResume()
{
base.OnResume();
等待ViewModel.Init();
如果(_chartView!=null)
{
InitializeChart();
}
}
...        

从服务中获取数据后,您的图表是否会更新数据?无论如何,我认为您没有完全掌握
async
wait
以及它们的操作方式。当然,您可以尝试在pageload上获取数据。在xamarin.forms中,可以使用
OnAppearing
方法。或者,您可以强制调用以在主线程上运行数据,这样数据将首先出现,然后执行代码的其余部分。@IdevDev从服务中获取数据后,没有图表不更新这是我的主要问题…数据是否出现?你试过调试它吗?你不应该检查图表是否为空,而不是相反吗??我的意思是如果(_chartView!=null),那么这一行就是
。如果(_chartView==null)
,我认为这应该是这样的
;bindset.Bind(_chartView).For(q=>q.Chart).To(vm=>vm.Chart);bindset.Apply()在ViewModel中,我有属性图,而不是条目,它可以工作。。。但是我不知道。。。。如果它是最好的解决方案