Executando verificação de segurança...
1

Final e Const no Dart / Flutter

Semelhanças

Caso a intenção seja definir uma variável que não mude o seu valor utilizamos duas palavras reservadas final e const antes do tipo da variável. Em resumo as duas são constantes e logicamente, após a sua inicialização, não podemos reatribuir nenhum valor a elas.

final String linguagem = "Dart";
linguagem = "Java"; // Erro: Can't assign to the final variable 'linguagem';

const double altura = 1.78;
altura = 1.75; // Erro: Can't assign to the const variable 'altura';

Diferenças

Enquanto final é uma constante em tempo de execução, const é uma constante de tempo de compilação.

Isso basicamente quer dizer que final não precisa conhecer o seu valor enquanto o compilador do Dart transforma o algoritmo em código de máquina. Mas const precisa, pois um valor constante para o Dart é aquele conhecido em tempo de compilação.

void main() {
  final String value = language();
  const String favorite = language(); // Erro: Const variables must be initialized with a constant value

  print(value);
  print(favorite);
}

String language() => "Dart";

O valor recebido pela variável declarada como final pode mudar em tempo de execução, mas não a sua atribuição. Por exemplo, o valor retornado por uma função externa ou atributos de um objeto podem mudar. Mas não podemos reatribuir um novo objeto do mesmo tipo ou alterar o conteúdo direto na variável pelo mesmo tipo retornado pela função.

void main() {
  final person = Person('Albert', 34);
  print(person.age); // 34

  person.age = 35;
  print(person.age); // 35

  ...

  final welcome = message();
  welcome = "Welcome to Flutter"; // Erro: The final variable 'welcome' can only be set once

}

class Person {
  String name;
  int age;

  Person(this.name, this.age);
}

...

String message() => 'Welcome to the amazing world of Dart';

Um outro exemplo disso são as listas. Onde vemos mais claramente que variáveis do tipo final se preocupam com a reatribuição mas não com os valores da lista.

final linguagens = ['Dart', 'Flutter'];
print(linguagens); // [Dart, Flutter]

linguagens.add('JavaScript');
print(linguagens); // [Dart, Flutter, JavaScript]

linguagens = ["outra lista"]; // Erro: Can't assign to the final variable 'linguagens'
Carregando publicação patrocinada...