1.2. Dart Iniciante: Null-Safety e Variáveis

Diego Dias
Flutter Brasil
Published in
6 min readNov 30, 2021

1.2.1. Null-Safety no Dart/Flutter 2.0

Tony Hoare, criador do null, disse que essa criação foi um erro que custou bilhões de dolares, pois:

  • Causa inúmeros erros;
  • Falhas de Sistemas;
  • Vulnerabilidades;
  • Códigos mentirosos;
  • Improdutividade…

Entretanto, o problema não está no null, mas sim ele chegar em um local onde não esperamos. Ex. você espera um texto em um local e chega um null que irá gerar um erro.

Objetivo: prevenir que o null chegue onde não queremos.

Já existia na linguagem Kotlin, Swift e agora existe no Dart.

1.2.2. Variáveis

Todo dispositivo eletrônico tem memória RAM onde é armazenado dados de forma temporária. O que fica armazenado nessa memória são as variáveis que são pequenas “caixas” onde se pode guardar coisas, portanto podemos dizer que as variáveis são posições ou alocações na memória.

Então, podemos dizer que as variáveis tem um certo ciclo vida, ficam visíveis por um determinado tempo.

1.2.2.1. Para que serve?

Dentro dela pode armazenar o que você quiser, números, textos, ou seja, qualquer dado.

Agora, iremos declarar algumas variáveis de diversos tipos, vejamos:

void main(){
String nome = "Loja Dart";
// Texto sempre em aspas duplas ou simples e declarado como 'String'
int bananas = 5;
// como é número não precisa de aspas
double preco = 10.5;
// para números com vírgula utilizar double, em Dart 2.0 não é mais necessário colocar o ponto
bool aindaTem = true;
// bool é um valor verdadeiro ou falso
print("O nome da loja é: $nome");
// para mostrar o que há na variável eu posso colocar $nome como mostrado ou ("o nome da loja é: " + nome)
}

Observação: Quando se usa // você pode comentar seu código para facilitar o entendimento do script, bem como /* ... seu texto... */.

Curiosidade! Uma coisa interessante é que todas as variáveis começam com letra minúscula, menos a String. Isso ocorre porque o String é o único que é uma classe.

Quando se cria uma variável não é necessário definir o valor da variável, mas para isso você deve utilizar o ? no tipo de variável, bem como é possível mudar o valor já declarado em uma variável:

void main(){ 
int bananas = 5; // pode ser também 'int bananas;'
bananas = 10; // aqui eu estou alterando o valor de bananas para 10, se eu colocar esta definição após o print, ela não irá mudar
String? pera; // Null-Safety
print(bananas); // aqui irá mostrar no console o valor 10, pois foi alterado
}

Caso você utiliza o ?, você pode utilizar o ?? e definir o valor caso seja null:

String name;print(name ?? "");

late diz para o Null-Safety que você irá utilizar a variável depois, antes de usar a variável (de forma atrasada). Você tem que instanciá-la antes de usar, caso contrário irá dar erro.

late String name;name = "nome";print(name);

Algo interessante do late é que vc pode evitar o consumo desnecessário de memória. Se definir a variável com late e não utilizá-la, você não irá utilizar memória.

late String name = "nome";

1.2.2.2. int

É uma variável numérica, porém só aceita números inteiros: 1, 2, 3…

void main() {
int idade = 35;
print(idade);
}

Dart é tipado, então você “tem” que declarar o tipo da variável. Desta forma, a estrutura da variável se comporta da seguinte forma: TIPO VARIÁVEL + NOME VARIÁVEL = VALOR VARIÁVEL

Quando se cria uma variável não é necessário definir o valor da variável, bem como é possível mudar o valor já declarado em uma variável:

void main() {
int idade;
print(idade);
}

Entretanto, se você não declarar o valor e printá-lo, irá retornar um null. Para corrigir isso, basta inicializá-la:

void main() {
int idade;
// Alterando a idade, se eu colocar esta definição após o print, ela não irá mudar

idade = 30;
print(idade);
}

1.2.2.3. num

Num é um tipo de variável que aceita números inteiros (0) ou decimal (Double: 0.0):

void main() {
num idade;
idade = 30.4;
print(idade);
idade = 15;
print(idade);
}

1.2.2.4. String

É um valor alfanumérico que é definido sempre por meio de aspas simples ou duplas.

void main() {
String nome = 'Paulo';
print(nome);
}

Há a possibilidade também de realizar a concatenação nas Strings por meio do operador de concatenação “+”:

void main() {
String nome = 'Paulo' +
'Roberto' +
'Pereira';
print(nome);
}

Porém isso irá retornar: PauloRobertoPereira. Você teria que colocar um espaço nas Strings “Paulo “+”Roberto “ para que ele retorne o nome espaçado.

Mas há a possibilidade também de ter uma varável de multiplas linhas utilizando três aspas ''':

void main() {
String nome = '''Paulo Roberto Pereira,
String de múltiplas linhas.''';
print(nome);
}

Ou até mesmo utilizar da seguinte forma:

void main() {
String nome = 'Paulo Roberto Pereira'
' String de múltiplas linhas.'
' Muito legal!';
print(nome);
}

Lembrando que, no caso acima, você deve dar um espaçamento para que não fique tudo junto sem espaços, no início ou fim.

1.2.2.5. var

Há também uma vantagem em Dart que, caso a variável seja definida, não é necessário especificar o tipo que Dart reconhece tal variável, mas para isso é necessário utilizar o var.

Assim, se eu declarar em var um número, automaticamente ela será um int. Não poderá mudá-la posteriormente para um texto string.

void main(){
var teste = 1;
print(teste);
}

1.2.2.5.1. Cuidado ao utilizar var

Ao definir uma variável com var o Dart utiliza mais processamento para tentar descobrir que tipo de variável é, portanto sempre tente definir a variável para evitar processamento desnecessário.

1.2.2.6. dynamic

A variável dynamic assume qualquer tipo, podendo alterá-la com qualquer tipo.

void main() {
dynamic teste = 1;
//ela pode ser qualquer tipo de variável e pode ser alterada para um texto sem apresentar erro
}

Tem que ter muito cuidado com o dynamic, pois pode acontecer de que seu app cresça de mais e lá na frente dê um problema, exemplo, em uma janela do seu app você espera retornar um int, mas o seu dynamic é um String e você esqueceu.

Quando você utilizar o final (não quer que alguém altere o tipo e o valor da variável) ele também infere qual a variável.

OBS. Você pode utilizar um cast, para mudar uma variável para um tipo específico, porém iremos ver isso mais para frente: teste as int;

1.2.2.7. Boas práticas em Variáveis

1.2.2.7.1. Lower Camel Case

A nomeclatura deve sempre seguir um padrão chamado lower camel case, ou seja, sempre a primeira letra será em minúsculo e as demais palavras tendo a primeira letra em maiúscula:

void main() {
String nomeCompleto = 'Paulo Roberto Pereira';
print(nomeCompleto);
}

Se for definido o nome da variável String NomeCompleto, retornará um erro.

1.2.2.8. Arrays

Ainda iremos ver arrays que basicamente são listas ou maps. Em Lists, você pode tipar a lista da seguinte forma: List listaNumeros = List(); basicamente, estamos informando que a lista a ser apresentada é de inteiros, mas perceba que estou informando que a variável é uma lista de inteiros no início e no fim. Portanto, se você já colocou que é uma lista de inteiros no início não precisa tipar novamente: List listaNumeros = List();

void main() {
// List listaNumeros = List();
// não precisa declarar duas vezes o tipo de variável
List listaNumeros = List();
listaNumeros = [1, 4];
print(listaNumeros);
}

Irá retornar: [1, 4]

Para saber todas as boas práticas em Dart, basta entrar no site https://dart.dev/guides/language/effective-dart e ver cada uma delas.

Dart Iniciante:
1.1. Dart Iniciante: Conhecendo a linguagem
1.2. Dart Iniciante: Null-Safety e Variáveis
1.3. Dart Iniciante: Operações Aritméticas
1.4. Dart Iniciante: Operações Lógicas

Dart Intermediário:
2.1. Dart Intermediário: Condicionais
2.2. Dart Intermediário: Realizando Repetições
2.3. Dart Intermediário: Maps e List
2.4. Dart Intermediário: Funções

Dart Avançado:
3.1. Orientação à Objetos em Dart: classes, atributos e objetos
3.2. Orientação à Objetos em Dart: Construtores
3.3. Orientação à Objetos em Dart: Getters e Setters
3.4. Orientação à Objetos em Dart: Herança
3.5. Orientação à Objetos em Dart: Reescritura de Métodos e Modificadores Static, Final e Const
3.6. Orientação à Objetos em Dart: Classes Abstratas
3.7. Orientação à Objetos em Dart: Mixin

--

--