Страница форм Xamarin не загружается, пока не будет выполнен асинхронный вызов - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь открыть новую страницу, которая показывает список, заполненный данными с сервера. Вызов для получения данных с сервера выполняется с помощью асинхронной функции, которая вызывается из метода OnAppearing. Однако, несмотря на то, что метод асинхронный, моя страница пользовательского интерфейса не отображается, пока не будет выполнен вызов. Как я могу это исправить или как лучше сделать этот звонок?

Это мой код XAML для страницы:

<StackLayout>
  <Label
    x:Name="NoPostsMessage"
    Text="You have not created any posts yet :("
    VerticalOptions="CenterAndExpand"
    HorizontalOptions="CenterAndExpand" />

  <ListView
    x:Name="PostList"
    SelectionMode="None">
    <ListView.ItemTemplate>
      <DataTemplate>
        <TextCell Text="{Binding Text}" Detail="{Binding Detail}" />
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</StackLayout>

Это мой код C #:

protected override void OnAppearing()
{
  base.OnAppearing();

  GetContributions();
}

async private void GetContributions()
{
  HttpClient client = new HttpClient();

  client.DefaultRequestHeaders.Add("Accept", "application/json");

  HttpResponseMessage response = await client
    .GetAsync
    (
      "websiteURL.com"
    );

  if (response.IsSuccessStatusCode)
  {
    APIResponse data = JsonConvert.DeserializeObject<APIResponse>(response.Content.ReadAsStringAsync().Result);
    if (data.ResponseCode == 1)
    {
      string payloadData = data.Data.ToString();
      List<TextCell> userPosts = JsonConvert.DeserializeObject<List<TextCell>>(payloadData);

      if (userPosts.Count == 0)
      {
        NoPostsMessage.IsVisible = true;
        PostList.IsVisible = false;
      }
      else
      {
        NoPostsMessage.IsVisible = false;
        PostList.IsVisible = true;

        ReportsList.ItemsSource = userPosts;
      }
    }
    else
    {
      await DisplayAlert("Error", data.ErrorMessage, "OK");
    }
  }
  else
  {
    await DisplayAlert("Error", "An error has occurred, please try again later", "OK");
  }
}

1 Ответ

0 голосов
/ 12 ноября 2018

, если вы не используете await, вызов async заблокирует пользовательский интерфейс

protected async override void OnAppearing()
{
  base.OnAppearing();

  await GetContributions();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...