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

[Dúvida] Dúvida sobre booleano no exercício de Map

Fiz o exercício tentando deixar o bool estaAutenticada validando com base na idade. Se a idade for igual ou maior que 18 ela deverá ficar como true e etc. Tentei fazer de duas maneiras mas não compreendi muito bem por que não funcionou. Vocês podem me ajudar?

Opção 1

void main(){
Pessoa Pessoa1 = Pessoa('Thiago', 32);

print(Pessoa1.toMap());

}
class Pessoa{
  String nome;
  int idade;
  bool estaAutenticada = idade>=18;

  Pessoa(this.nome, this.idade);


  Map<String,dynamic> toMap(){
    Map<String, dynamic> dados = {};
      dados['Nome'] = nome;
      dados['Idade'] = idade;
      dados['Esta Autenticada'] = estaAutenticada;
      return dados;
    }
  }

Opção 2

void main(){
Pessoa Pessoa1 = Pessoa('Thiago', 32);

print(Pessoa1.toMap());

}
class Pessoa{
  String nome;
  int idade;
  bool? estaAutenticada;
  
  if(idade>=18){
    estaAutenticada=true;
  }else{
    estaAutenticada=false;
  }

  Pessoa(this.nome, this.idade);


  Map<String,dynamic> toMap(){
    Map<String, dynamic> dados = {};
      dados['Nome'] = nome;
      dados['Idade'] = idade;
      dados['Esta Autenticada'] = estaAutenticada;
      return dados;
    }
  }

no fim das contas, acabei resolvendo meu problema com este código:

void main(){
Pessoa Pessoa1 = Pessoa('Thiago', 32);

print(Pessoa1.toMap());

}
class Pessoa{
  String nome;
  int idade;

  Pessoa(this.nome, this.idade);

  Map<String,dynamic> toMap(){
    Map<String, dynamic> dados = {};
      dados['Nome'] = nome;
      dados['Idade'] = idade;
      dados['Esta Autenticada'] = idade>=18;
      return dados;
    }
  }

mas gostaria muito de entender melhor por que os outros 2 primeiros não funcionaram. Sei que tem a ver com o uso do inteiro "idade" mas não compreendo pq não posso fazer desse jeito.

2 respostas
solução!

Olá, Thiago! Tudo bem? Vamos entender o que aconteceu com os seus códigos.

Na Opção 1, você tentou atribuir o valor de idade>=18 diretamente na declaração do atributo estaAutenticada. O problema é que, neste momento, a variável idade ainda não foi inicializada, portanto, o Dart não consegue avaliar essa expressão.

Na Opção 2, você tentou utilizar uma estrutura condicional (if/else) diretamente no corpo da classe. No Dart, isso não é permitido. As estruturas condicionais devem estar dentro de um método ou construtor.

A solução que você encontrou é perfeitamente válida e funciona bem para o seu caso. Mas, se você quiser manter a lógica de autenticação dentro da classe Pessoa, você pode fazer isso no construtor da classe, assim:

class Pessoa{
  String nome;
  int idade;
  bool estaAutenticada;

  Pessoa(this.nome, this.idade){
    estaAutenticada = idade>=18;
  }

  Map<String,dynamic> toMap(){
    Map<String, dynamic> dados = {};
    dados['Nome'] = nome;
    dados['Idade'] = idade;
    dados['Esta Autenticada'] = estaAutenticada;
    return dados;
  }
}

Nesse caso, quando uma nova Pessoa é criada, o Dart primeiro inicializa nome e idade, e depois executa o código dentro do construtor, que define estaAutenticada com base na idade.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Muito obrigado Renan! Não sabia que eu posso criar esse tipo de função diretamente no construtor! Sensacional!