Getters e Setter em Dart e Flutter.
Como em muitos outros idiomas, getters \ setters são métodos que dão acesso de leitura / gravação às propriedades do objeto.
Neste artigo, veremos exemplos simples e os executaremos no dartpad.

No Dart, a leitura e gravação de quaisquer propriedades de objetos é implementada usando getters \ setters.
Por exemplo, veja o código
class Person { String name; int birthYear; Person(this.name, this.birthYear); } void main() { Person person = Person('username', 1990); print('Hello ${person.name}, you was born in ${person.birthYear}'); person.name = 'Newusername'; print('Hello ${person.name}, you was born in ${person.birthYear}'); }
Execute o código no Dartpad.
Cada propriedade nesta classe possui um setter implícito para gravar nele e um getter implícito para obter o valor.
Quando chamamos person.name = 'Newusername';
então nos voltamos para a classe setter. E depois disso obtemos seu valor person.name
usando getter.
No Dart, podemos (e isso é recomendado para abstração de código) criar nossos próprios getters e setters. Isso nos permite inicializar nossas classes com propriedades e, no futuro, envolvê-las com métodos diferentes sem alterar o código do cliente.
Por exemplo, digamos que nosso projeto com a classe Person tenha evoluído e precisamos determinar a idade da maioria. Podemos fazer isso sem alterar o construtor e as propriedades básicas do objeto.
class Person { String name; int birthYear; bool get isAdult => (DateTime.now().year - birthYear) > 18; Person(this.name, this.birthYear); } void main() { Person personAdult = Person('adultUser', 1990); print('Hello ${personAdult.name}, you was born in ${personAdult.birthYear}, you are ${personAdult.isAdult ? 'adult' : 'not adult'}'); Person personNotAdult = Person('adultUser', 2005); print('Hello ${personNotAdult.name}, you was born in ${personNotAdult.birthYear}, you are ${personNotAdult.isAdult ? 'adult' : 'not adult'}'); }
Execute o código no Dartpad.
Executando o código no Dartpad, vemos que adicionamos um novo comportamento de classe, enquanto o código do cliente já criado não será afetado e tudo continuará funcionando.
Da mesma forma, se em alguma parte do projeto começamos a trabalhar com a idade, e não com a data de nascimento, podemos adicionar o setter para registrar o aniversário ao indicar a idade.
class Person { String name; int birthYear; bool get isAdult => (DateTime.now().year - birthYear) > 18; int get age => (DateTime.now().year - birthYear); set age(int val) => birthYear = (DateTime.now().year - val); Person(this.name, this.birthYear); } void main() { Person personAdult = Person('adultUser', 1990); print('Hello ${personAdult.name}, you was born in ${personAdult.birthYear}, you are ${personAdult.isAdult ? 'adult' : 'not adult'}'); Person personNotAdult = Person('adultUser', 2005); print('Hello ${personNotAdult.name}, you was born in ${personNotAdult.birthYear}, you are ${personNotAdult.isAdult ? 'adult' : 'not adult'}'); //check how setter work print(personAdult.birthYear); personAdult.age = 5; print(personAdult.birthYear); }
Execute o código no Dartpad.
Em geral, getter e setter são usados com tanta frequência que sua criação automática é incorporada ao Android Studio. Quando o cursor na propriedade é pressionado, Command + N (no Windows, Ctrl + N) e sua criação fica no menu de contexto.
Boa codificação para todos!