首页 > 解决方案 > 使用安静的 Web 服务

问题描述

我正在尝试使用一个界面,但我在这里遇到了一些困难。我正在尝试将其设置为内容页面后面的 xamrin 列表视图

public class xxxApiClient : IApi
 {
        readonly string url = "http://localhost:81/ ";
        readonly IHttpService httpService;

        public xxxApiClient(IHttpService httpService)
        {
            this.httpService = httpService;
        }

        public Task<List<JobsList>> GetJobs() => httpService.Get<List<JobsList>>($"{url}JobsLists");
}

我如何不确定我如何正确地使用 getjobs 我正在尝试以下

public partial class JobsPage : ContentPage ,xxxWC.Interface.IApi
{
        public xxxWC.Interface.IApi api = new ful;

          public JobsPage ()
        {
            InitializeComponent ();
        }

        private Task SetItemSource()
    .   {
    .       JobListing.ItemsSource =   FuelAp
 }

如何在 setItemSource 方法中正确使用上述 get 作业?

我很难理解的一点就在这里。

如何调用已在 API Client 中创建的基本 GetJobs 方法。

      Task<List<JobsList>> IApi.GetJobs()
        {
            throw new NotImplementedException();
        }

        private Task SetItemSource()
     {
            JobListings.ItemsSource =await GetJobs();
    }
}

编辑 2 好的,根据下面的建议我更新了我的代码

    IHttpService httpService;
   xxxApiClient _api = newxxxApiClient(httpService);
      public JobsPage ()
    {
        InitializeComponent ();
    }

    private Task SetItemSource()
 {
        JobListings.ItemsSource =await GetJobs();
}

但我收到以下错误

严重性代码 描述 项目文件行抑制状态错误 CS0236 字段初始化程序无法引用非静态字段、方法或属性 'JobsPage.httpService' xxxCallManagmentAppMobile C:\Work\xxxCallAppDev\XamForms\xxxCallManagmentApp\xxxCallManagmentAppMobile\FuelCallManagmentAppMobile\Views\JobsPage。 xaml.cs 17 活动

有人可以解释为什么

编辑 3 好的,我走得更远了,但仍然有一些问题。由于没有等待主要方法,我该如何调用 set SetItemSource。

xxxApiClient _api ;
      public JobsPage ()
    {
        InitializeComponent ()
            SetItemSource();

    }

    private async Task SetItemSource()
 {
        JobListings.ItemsSource = await client.GetJobs();
}

标签: c#xamarin

解决方案


假设IApi已经映射到xxxApiClient实现

尝试使用DependencyService解析服务,以便在视图中使用它

public partial class JobsPage : ContentPage {
    public readonly IApi client;

    public JobsPage () {
        InitializeComponent ();
        client = DependencyService.Get<IApi>();
    }

    private async Task SetItemSource() {
        JobListing.ItemsSource = await client.GetJobs();
        //...
    }
}

至于调用SetItemSource,它是异步的,所以应该等待。这不能在构造函数中完成。

考虑创建一个可以引发的事件,其处理程序用于等待所需的行为。

private event EventHandler loadingData = delegate { };
private async void onLoadingData(object sender, Eventargs args) {
    JobListing.ItemsSource =   await client.GetJobs();
}

完整代码

public partial class JobsPage : ContentPage {
    public readonly IApi client;

    public JobsPage () {
        InitializeComponent ();
        //resolving client
        client = DependencyService.Get<IApi>();
        //subscribing to event 
        loadingData += onLoadingData;
        //raising event
        loadingData(this, EventArgs.Empty);
    }

    private async Task SetItemSource() {
        JobListing.ItemsSource = await client.GetJobs();
        //...
    }

    private event EventHandler loadingData = delegate { };
    private async void onLoadingData(object sender, Eventargs args) {
        JobListing.ItemsSource =   await client.GetJobs();
    }
}

尽管创建了自定义事件,但您可以轻松地使用视图的事件/事件处理程序。

所有这些代码实际上都应该存在于视图模型中,然后在绑定上下文中绑定到视图。


推荐阅读