9
respostas

[Bug] Aula 03 - Crie Aplicativos Mobile com Visual Studio - Item 3 LoginService

Prezados. Estou no curso "Xamarin parte 3" na terceira aula, LoginService. Até o momento minha aplicação estava rodando normalmente. Agora ela não está mais rodando em meu emulador, o erro apresentado é os que seguem abaixo:


Gravidade Código Descrição Projeto Arquivo Linha Estado de Supressão Erro CS0104 "Usuario" é uma referência ambígua entre "App1.Models.Usuario" e "App1.Views.Usuario" App1 C:.....\source\repos\App1\App1\LoginService.cs 47 Ativo

O erro acima refere-se ao da linha abaixo:

MessagingCenter.Send<Usuario>(resultadoLogin.usuario, "SucessoLogin");

Já, o que segue abaixo refere-se ao "var resultadoLogin" da linha acima:

Gravidade Código Descrição Projeto Arquivo Linha Estado de Supressão Erro CS1503 Argumento 1: não é possível converter de "App1.Models.Usuario [C:......\source\repos\App1\App1\Models\Usuario.cs(7)]" para "App1.Models.Usuario [App1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]" App1 C:\Users\CRIACAO\source\repos\App1\App1\LoginService.cs 47 Ativo


O meu arquivo Models\Usuario.cs está da seguinte forma:

using System;
using System.Collections.Generic;
using System.Text;

namespace App1.Models
{
    public class Usuario
    {
        public int id { get; set; }
        public string nome { get; set; }
        public string email { get; set;}
        public string dataNascimento { get; set; }
        public string telefone { get; set; }
    }

    public class ResultadoLogin
    { 
        public Usuario usuario { get; set; } 
    }
}

Será que alguém poderia me ajudar? Pois estou alguns dias sem conseguir progredir com este curso por conta deste erro.

Agradeço um retorno.

9 respostas

Oi Rafael, tudo bem?

Pelo que você descreveu, parece que o compilador está confuso sobre qual classe "Usuario" você está se referindo, já que existem duas classes com o mesmo nome em namespaces diferentes ("App1.Models.Usuario" e "App1.Views.Usuario").

Uma solução possível para este problema seria utilizar o nome completo da classe, incluindo o namespace, quando você for usá-la. No seu caso, você poderia alterar a linha que está dando erro para:

MessagingCenter.Send<App1.Models.Usuario>(resultadoLogin.usuario, "SucessoLogin");

Isso deve ajudar o compilador a entender que você está se referindo à classe "Usuario" que está no namespace "App1.Models".

Outra solução seria renomear uma das classes "Usuario" para evitar a ambiguidade. Por exemplo, você poderia renomear "App1.Views.Usuario" para "App1.Views.UsuarioView". Assim, quando você se referir a "Usuario", o compilador saberá que você está falando de "App1.Models.Usuario".

Espero que isso resolva o seu problema. Lembre-se, estas são sugestões e podem não funcionar em todos os casos, pois dependem do restante do seu código.

Um abraço e bons estudos.

Olá Lorena, agradeço pela sua ajuda.

Ajustei conforme sua orientação. Agora, está ocorrendo um erro ao logar.

Quando logo, o App encontra o usuário, efetua o login e na hora de mostrar a listagem dos carros ele interrompe o funcionamento direcionando para "exceptionservicescommon.cs".

Ele informa "exceção sem tratamento" na linha "throw m_Exception;" do código abaixo:

#if MONO
        [System.Diagnostics.StackTraceHidden]
#endif
        public void Throw()
        {
#if FEATURE_EXCEPTIONDISPATCHINFO
            // Restore the exception dispatch details before throwing the exception.
            m_Exception.RestoreExceptionDispatchInfo(this);
#endif
            throw m_Exception; 
        }

#if MONO
        [System.Diagnostics.StackTraceHidden]
        public static void Throw (Exception source) => Capture (source).Throw ();
#endif
    }
}
#endif // FEATURE_EXCEPTIONDISPATCHINFO

Msg: System.ArgumentNullException: 'Value cannot be null. Parameter name: sender'

O que pode ser?

Oi Rafael!

Erro durante o Login - Exceção sem Tratamento:

O erro de exceção sem tratamento que você está enfrentando parece ser um problema no código relacionado ao envio de uma mensagem pelo MessagingCenter. No entanto, o erro específico é uma exceção System.ArgumentNullException com a mensagem "Value cannot be null. Parameter name: sender."

Esse erro geralmente ocorre quando você tenta enviar uma mensagem pelo MessagingCenter com um parâmetro "sender" nulo. O "sender" é o objeto que está enviando a mensagem, e não deve ser nulo. Para solucionar esse problema, siga as etapas abaixo:

  1. Verifique se resultadoLogin.usuario não é nulo antes de enviar a mensagem. Você pode fazer isso da seguinte maneira:
if (resultadoLogin.usuario != null)
{
    MessagingCenter.Send<App1.Models.Usuario>(resultadoLogin.usuario, "SucessoLogin");
}
else
{
    // Lide com a situação em que resultadoLogin.usuario é nulo
}
  1. Certifique-se de que a classe ResultadoLogin esteja populada corretamente com um objeto de usuário antes de chamar o MessagingCenter.Send. Isso garantirá que você esteja enviando um objeto não nulo como "sender."

Espero que essas sugestões ajudem a resolver o problema do seu aplicativo.

Um abraço e bons estudos.

Olá Lorena. Obrigado pelo retorno. Aparentemente ele está nulo sim.

Poderia me orientar sobre como posso corrigir?

As linhas são:

var conteudoResultado = await resultado.Content.ReadAsStringAsync();
var resultadoLogin = JsonConvert.DeserializeObject<ResultadoLogin>(conteudoResultado);

Outro detalhe que percebi é que no MasterDetailView.xaml.cs existe uma linha em que o "usuario" está em cinza, como se não estivesse sendo utilizado. Segue abaixo para um melhor entendimento:

namespace App1.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class MasterDetailView : MasterDetailPage
    {
        private readonly Usuario usuario;

        public MasterDetailView(Usuario usuario)
        {
            InitializeComponent();
            this.usuario = usuario;
            this.Master = new MasterView(usuario);
        }
    }
}

Neste caso está cinza no "usuario" da linha:private readonly Usuario usuario;

Seria isso que pode estar ocasionando tal situação?

Aguardo seu retorno.

Olá. Infelizmente não estou conseguindo progredir com o curso. Alguém poderia me orientar com relação a situação acima?

Olá! Que curso é esse? você pode mandar o link? Não encontrei na plataforma, se não aparece pra todos deve ta descontinuado por conter bugs, nesses casos é melhor nem fazer.

Enfim, pelo o que você disse irei dar umas dicas:

O erro que você está enfrentando é relacionado à ambiguidade entre duas classes chamadas "Usuario," uma no namespace "App1.Models" e outra no namespace "App1.Views." Isso ocorre porque o compilador não consegue determinar qual delas você está tentando usar. Para resolver essa ambiguidade, você pode seguir uma das soluções mencionadas anteriormente:

Solução 1: Utilizar o nome completo da classe, incluindo o namespace, sempre que você for usá-la. Por exemplo:

MessagingCenter.Send<App1.Models.Usuario>(resultadoLogin.usuario, "SucessoLogin");

Solução 2: Renomear uma das classes "Usuario" para evitar a ambiguidade. Por exemplo, você poderia renomear "App1.Views.Usuario" para "App1.Views.UsuarioView."

Você mencionou que após ajustar o código de acordo com a primeira sugestão, o aplicativo agora encontra o usuário, efetua o login, mas encontra um erro durante a listagem dos carros e direciona para "exceptionservicescommon.cs" com a mensagem de exceção "System.ArgumentNullException: 'Value cannot be null. Parameter name: sender'."

Esse erro ocorre porque você está tentando enviar uma mensagem pelo MessagingCenter com um parâmetro "sender" nulo. O "sender" não deve ser nulo. Para resolver isso, você pode verificar se o objeto "resultadoLogin.usuario" não é nulo antes de enviar a mensagem, como no código a seguir:

if (resultadoLogin.usuario != null)
{
    MessagingCenter.Send<App1.Models.Usuario>(resultadoLogin.usuario, "SucessoLogin");
}
else
{
    // Lide com a situação em que resultadoLogin.usuario é nulo
}

Quanto à linha onde o "usuario" está em cinza no arquivo "MasterDetailView.xaml.cs," isso pode indicar que a variável "usuario" não está sendo utilizada nesse contexto. Se isso não afeta a funcionalidade desejada do código, você pode remover a declaração da variável "usuario" no construtor, já que não está sendo usada ali. Isso não deve causar problemas adicionais.

Para corrigir a situação de "resultadoLogin.usuario" ser nulo, você deve verificar o processo de deserialização de JSON que você está usando. Certifique-se de que o objeto "resultadoLogin" está sendo populado corretamente com os dados do usuário durante a deserialização.

O código que você compartilhou para a deserialização parece correto:

var conteudoResultado = await resultado.Content.ReadAsStringAsync();
var resultadoLogin = JsonConvert.DeserializeObject<ResultadoLogin>(conteudoResultado);

No entanto, é importante verificar se o JSON retornado pela chamada da API está formatado corretamente e contém os dados esperados do usuário. Qualquer problema na estrutura do JSON ou na classe "ResultadoLogin" pode causar o objeto "resultadoLogin.usuario" ser nulo.

Resumindo, você pode seguir os seguintes passos para resolver os problemas mencionados:

  1. Certifique-se de que a deserialização do JSON está ocorrendo corretamente e que o objeto "resultadoLogin" está sendo populado com os dados do usuário.
  2. Verifique se o objeto "resultadoLogin.usuario" não é nulo antes de enviar a mensagem pelo MessagingCenter.
  3. Se a variável "usuario" no construtor de "MasterDetailView.xaml.cs" não estiver sendo utilizada, você pode removê-la sem afetar a funcionalidade.

Certifique-se de que a deserialização do JSON está ocorrendo corretamente e que o objeto "resultadoLogin" está sendo populado com os dados do usuário.

A variável conteudoResultado da linha abaixo está sendo populada.

var conteudoResultado = await resultado.Content.ReadAsStringAsync();

Quando chega na linha abaixo a conteudoResultado continua populada mas a variável resultadoLogin não.

var resultadoLogin = JsonConvert.DeserializeObject<ResultadoLogin>(conteudoResultado);


Verifique se o objeto "resultadoLogin.usuario" não é nulo antes de enviar a mensagem pelo MessagingCenter. Sim, ele está nulo.


Se a variável "usuario" no construtor de "MasterDetailView.xaml.cs" não estiver sendo utilizada, você pode removê-la sem afetar a funcionalidade. Ok

Realmente não estou conseguindo entender de onde teria que vir o valor de resultadoLogin.usuario, pois de acordo com a API do curso ele não existe dentro dela. Aparentemente parece vir App1.Models.Usuario,cs que está com o código abaixo:

namespace App1.Models
{
    public class Usuario
    {
        public int id { get; set; }
        public string nome { get; set; }
        public string email { get; set;}
        public string dataNascimento { get; set; }
        public string telefone { get; set; }
    }

    public class ResultadoLogin
    { 
        public Usuario usuario { get; set; } 
    }
}

Agradeço se alguém puder me dar uma orientação.

O link do curso é: https://cursos.alura.com.br/course/xamarin-aplicativos-mobile-com-visual-studio-parte-3/task/25010

Bom dia. obrigado aos dois!

Olá Rafael.

Esse curso ta desativado e se ele foi desativado é porque tá com bugs e erros de versões, não indicaria que fizesse pois vai passar muita raiva. Pede atualização desse curso aqui: https://docs.google.com/forms/d/e/1FAIpQLScwKyaSvuFXK9SmMJoLPuYAS2qD_XAAnZPxMZij9qVeflbhBg/viewform

Mas enfim vou dar dicas do que tu podes fazer:

Primeiramente, o erro que você mencionou é devido à ambiguidade entre duas classes chamadas "Usuario" nos namespaces "App1.Models" e "App1.Views". Para resolver essa ambiguidade, você pode seguir as soluções sugeridas anteriormente:

Solução 1: Utilizar o nome completo da classe, incluindo o namespace, sempre que você for usá-la. Por exemplo:

MessagingCenter.Send<App1.Models.Usuario>(resultadoLogin.usuario, "SucessoLogin");

Solução 2: Renomear uma das classes "Usuario" para evitar a ambiguidade. Por exemplo, você poderia renomear "App1.Views.Usuario" para "App1.Views.UsuarioView."

Quanto ao novo problema que surgiu após as alterações, relacionado a uma exceção sem tratamento com a mensagem "System.ArgumentNullException: 'Value cannot be null. Parameter name: sender'," isso indica que o "sender" está nulo quando você tenta enviar uma mensagem pelo MessagingCenter.

Você mencionou que a variável "resultadoLogin.usuario" está nula, o que é um indicativo de que a deserialização do JSON não está ocorrendo corretamente. Certifique-se de que o JSON retornado pela chamada da API está formatado corretamente e contém os dados esperados do usuário.

Para solucionar isso, você pode adicionar uma verificação para garantir que "resultadoLogin.usuario" não seja nulo antes de enviar a mensagem. Por exemplo:

if (resultadoLogin.usuario != null)
{
    MessagingCenter.Send<App1.Models.Usuario>(resultadoLogin.usuario, "SucessoLogin");
}
else
{
    // Lide com a situação em que resultadoLogin.usuario é nulo
}

Além disso, é importante verificar se a classe "ResultadoLogin" está corretamente mapeada para o JSON durante a deserialização. Certifique-se de que os nomes de propriedades e tipos correspondem aos dados reais retornados pela API.

Quanto à variável "usuario" em "MasterDetailView.xaml.cs" que está em cinza, isso indica que ela não está sendo usada nesse contexto. Se não está afetando a funcionalidade do código, você pode removê-la sem problemas.

Em relação à origem dos dados para "resultadoLogin.usuario," você mencionou que a API do curso não fornece esse campo. Nesse caso, é importante verificar se a estrutura do JSON retornado pela API está correta e se ele contém todas as informações necessárias, incluindo o objeto "usuario." Certifique-se de que a classe "ResultadoLogin" reflete corretamente a estrutura do JSON.

Em resumo, para prosseguir com o curso, siga estas etapas:

  1. Garanta que a deserialização do JSON esteja ocorrendo corretamente e que a classe "ResultadoLogin" reflita a estrutura dos dados retornados pela API.

  2. Adicione uma verificação para garantir que "resultadoLogin.usuario" não seja nulo antes de enviar a mensagem pelo MessagingCenter.

  3. Se a variável "usuario" em "MasterDetailView.xaml.cs" não estiver sendo utilizada, você pode removê-la sem afetar a funcionalidade.

  4. Certifique-se de que a API do curso forneça os dados necessários, incluindo o objeto "usuario."