Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Método async

Boa tarde, estou tentando preencher uma ObservableCollection a partir de um SelectedItem de um Picker com HTTPClient, porem me retorna um erro relacionado a o método não ser assíncrono. Ha alguma forma de tornar o método get; set; de uma propriedade assíncrono?

Classe ViewModel:

public class CadastroViewModel : BaseViewModel
    {
        public ObservableCollection<Cidade> cidades { get; set; }
        public ObservableCollection<Bairro> bairros { get; set; }
        private const string URL_CIDADES = "http://172.20.1.3:8383/rest/cidade/listar";
        private string URL_BAIRROS = "http://localhost:8080/rest/bairro/listar/";

        private bool aguardando;
        public bool Aguardando
        {
            get { return aguardando; }
            set
            {
                aguardando = value;
                OnPropertyChanged();
            }
        }

        private Cidade cidadeSelecionada;
        public Cidade CidadeSelecionada
        {
            get
            {
                return cidadeSelecionada;
            }
            set
            {
                cidadeSelecionada = value;
                if (value!= null)
                {
                    await getBairros(); (nesta linha recebo o erro)
                }
            }
        }

        private Bairro bairroSelecionado;
        public Bairro BairroSelecionado
        {
            get
            {
                return bairroSelecionado;
            }
            set
            {
                bairroSelecionado = value;
            }
        }

        public CadastroViewModel()
        {
            this.bairros = new ObservableCollection<Bairro>();
            this.cidades = new ObservableCollection<Cidade>();
        }


        //Metodo responsavel por realizar a busca das cidades
        public async Task GetCidades()
        {
            Aguardando = true;
            HttpClient cliente = new HttpClient();
            var resultado = await cliente.GetStringAsync(URL_CIDADES);

            var cidadesJson = JsonConvert.DeserializeObject<Cidade[]>(resultado);

            foreach (var cidade in cidadesJson)
            {
                this.cidades.Add(cidade);
            }
            Aguardando = false; 
        }

        //Metodo responsavel por realizar a busca dos bairros por meio do id da cidade selecionada
        public async Task getBairros()
        {
            Aguardando = true;
            HttpClient cliente = new HttpClient();
            URL_BAIRROS = URL_BAIRROS + cidadeSelecionada.id;
            var resultado = await cliente.GetStringAsync(URL_BAIRROS);

            var bairrosJson = JsonConvert.DeserializeObject<Bairro[]>(resultado);

            foreach (var bairro in bairrosJson)
            {
                this.bairros.Add(bairro);
            }
            Aguardando = false;
        }
    }
4 respostas
solução!

Oi João, tudo bem?

Você não pode chamar um método assíncrono de dentro do setter de uma propriedade. Em vez disso, eu tentaria: 1) criar um Command só para carregar os barros e 2) chamar esse Command a partir do setter da propriedade CidadeSelecionada, por exemplo:

//na classe:
private ICommand carregarBairrosCommand;


//no construtor:
carregarBairrosCommand = new Command(async (cidade) => await CarregarBairros(cidade)));

//na classe:
async async Task CarregarBairros(string cidade)
{
    // blablabla
}


//na propriedade CidadeSelecionada
set 
{
...
carregarBairrosCommand.Execute(cidade));
}

A chamada deu certo, porem agora me encontro com o erro

Unhandled Exception:

Newtonsoft.Json.JsonSerializationException: <Timeout exceeded getting exception details> ocorreu

Se eu clico em "Continuar" no visual studio ele me retorna outro erro

Unhandled Exception:

Newtonsoft.Json.JsonSerializationException: Error converting value "Raposa" to type 'SalveMariaR.Model.Cidade'. Path '[0].cidade', line 1, position 19. ocorreu

Bom dia João. O problema está na deserialização do seu objeto. Verifique se o json retornado está no formato correto e se o tipo de dado esperado pela sua classe é equivalente a esse dado recebido.

Bom dia, consegui verificar onde estava a incompatibilidade com o json. Obrigado