6
respostas

Dúvida sobre Código

Bom dia!

Estou com uma dúvida para entender melhor o funcionamento, relacionando com Orientação a Objetos. Trabalho a anos com PHP e OO, então só gostaria de entender essa linha por exemplo:

class  FormularioTransferencia extends StatelessWidget {
  @override

  final TextEditingController _controladorCampoNumeroConta = TextEditingController();
  final TextEditingController _controladorCampoCampoValor = TextEditingController();

  // ... continua o codigo
}

Esse final controladorCampoNumeroConta seria um atributo (que chamamos em OO), que recebe uma instância do objeto TextEditingController e tem que ser do tipo TextEditingController? O final é para dizer que é um atributo sem mudança?

Como muda bastante a sintaxe de uma linguagem para outra, gostaria só de entender a nível de orientação a objetos, o que está ocorrendo. Nunca tive contato com Dart.

Fico no aguardo :D

6 respostas

Fala João! Parabéns pelo interesse de aprender mais fundo, isso é ótimo!

Reposta curta: Sim. Exatamente;

Resposta completa:

É interessante perceber que final, const e static no Dart representam coisas bem diferentes, mas que podem confundir bastante, vou falar das três para deixar claro:

Static

Vamos usar Static durante a construção de uma classe para definir membros (atributos, métodos, etc) que estão disponíveis apenas nas próprias classes (e não nas suas instâncias).

O staticmodifica membros em uma classe!

Exemplo:

class MyClass {
  static double ano = 2022;
  double mes = 01;
}

class OtherClass {
  void canIAccessAno() {
    MyClass instancia = MyClass();
    instancia.mes = 2; // Consigo acessar
    instancia.ano // Erro! Não consigo acessar
  }
}

Final

Já o final significa atribuição única para variáveis: uma variável ou campo final deve ser inicializada. Uma vez atribuído um valor, o valor de uma variável final não pode ser alterado.

O final modifica variáveis!

Exemplo:

class MyClass {
  final String name = "Ricarth";
  final String lastName; // Erro! Variáveis finais devem ser inicializadas!

  void changeName(){
    name = "Lilie"; // Erro! Variáveis finais não podem ser alteradas!
  }
}

Const

Essa é mais complicada e sutil. E depois da atualização do Flutter onde o Linter foi padronizado, aparece warning pra todo canto pedindo para você colocar consts! Se quiser saber mais sobre isso, assiste esse Alura+!

As consts modificam valores!

Exemplo:

class MyClass {
  String? name; // Sem final ou static

  void changeName(String novoNome){
    name = novoNome; 
  } // Até aqui tudo bem

  void run(){
    const String constName = "Ricarth";
    changeName(constName); // Funciona!
    constName = "Lilie";  // Erro! O valor "Ricarth" não pode ser mudado!
  }
}

Curiosidade: Final x Const

O final não transmite sua imutabilidade, o constsim! Imagine o caso de uma lista, como o modificador final os elementos da lista ainda podem ser mudados por acesso direto, já com o const não.

class MyClass {
  final List<String> names = ["Ricarth", "Lima"];
  static const List<String> constNames = ["Ricarth", "Lima"];

  void run() {
    names[0] = "Lilie"; // Funciona!
    constNames[0] = "Lilie"; // Erro em tempo de execução!
  }
}
Ocorreu uma exceção.
UnsupportedError (Unsupported operation: Cannot modify an unmodifiable list)

Conclusões

E para quê usar isso tudo? Basicamente por duas razões:

Legibilidade É extremamente útil se comunicar com outros programadores e programadoras que vão usar seu código no futuro.

Eficiência Indicando membros, variáveis ou valores imutáveis você permite o Flutter fazer otimizações que vão aumentar a eficiência da sua aplicação.

No mais, é isso, espero que tenha ajudado! Deixo como referências/leituras complementares esses dois links:

Aproveitando...

Outra duvida minha... em algumas declarações eu noto por exemplo:

<Widget>[...]

isso que fica entre esses simbolos de maior e menor, seria o que exatamente? uma instância de uma classe? porque?

Nesse caso não é uma instância de uma classe, e sim uma especificação de tipo!

Por exemplo:

List<String> names = ["Ricarth", "Lima"]; // Essa é uma lista do tipo String. 
names[0] = 23; // Erro! 23 não é uma String!

Quando fazemos <Widget>[...] indicamos que estamos passando uma Lista de Widgets, que é, por exemplo, exatamente o que um childrens de uma column ou uma row espera receber.

Entendi, estamos dizendo que o tipo é Widget, altamente tipado. legal... trabalho com PHP a anos (sou sênior) e no PHP ainda não tínhamos uma tipagem tão completa assim.

Eu abri um tópico aqui no Fórum referente a uma dúvida minha de versão Android e quando/como atualizar app para versões nova do Android.

Se puder ver depois fico gratooo :D