1. Padrão for padrão
Sintaxe: for(inicialização; condição; iterador) { corpo do laço }
1: Concatenação básica de string
void main() {
var message = StringBuffer('welcome to FoxDevelop.com');
for (var i = 0; i < 5; i++) {
message.write('!');
}
print(message); // welcome to FoxDevelop.com!!!!!
}Code language: Dart (dart)
O laço percorre de 0 até 5 (não inclui o 5), ou seja, i recebe valores de 0 a 4, executando cinco vezes no total. Cada vez um ponto de exclamação é adicionado no final da string welcome to FoxDevelop.com.
1ª vez: welcome to FoxDevelop.com!
2ª vez: welcome to FoxDevelop.com!!
…
5ª vez: welcome to FoxDevelop.com!!!!!
Característica: closure captura índice independente (grande diferença em relação ao JavaScript)
No Dart, cada repetição do laço cria uma variável i independente, evitando o problema comum do JS onde todos os callbacks imprimem apenas o valor final 2.
void main() {
var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
for (final c in callbacks) {
c();
}
}
// Saída
// 0
// 1
Code language: Dart (dart)
2. for-in para percorrer objetos iteráveis List/Set
Indicado para casos onde você só precisa dos valores dos elementos, sem os índices.
Forma básica
class Candidate {
void interview() => print("Entrevista concluída");
}
void main() {
var candidates = [Candidate(), Candidate()];
for (var candidate in candidates) {
candidate.interview();
}
}Code language: Dart (dart)
Percorre a lista candidates, armazena cada elemento na variável candidate e executa o método interview(). Após ler cada item, o iterador avança automaticamente para o próximo.
Avançado
for-in com desestruturação de padrão de objeto (Dart 3+)
class Candidate {
final String name;
final int yearsExperience;
Candidate({required this.name, required this.yearsExperience});
}
void main() {
var candidates = [
Candidate(name: "Lily", yearsExperience: 6),
Candidate(name: "Tom", yearsExperience: 3),
];
// Desestrutura campos diretamente via padrão de objeto
for (final Candidate(:name, :yearsExperience) in candidates) {
print('$name tem $yearsExperience anos de experiência profissional');
}
}
Code language: Dart (dart)
Combinado com a desestruturação apresentada antes, extrai automaticamente as duas propriedades do objeto para as variáveis name e yearsExperience, que podem ser usadas no corpo do laço.
3. Método de percurso Iterable.forEach ()
Percurso funcional nativo das coleções, recebendo uma função callback para processar cada elemento.
void main() {
var collection = [1, 2, 3];
collection.forEach(print);
// Saída 1 2 3
}Code language: Dart (dart)
forEach é um método nativo do Dart disponível em todas as coleções iteráveis.
4. while / do-while
1. while
Avalia a condição primeiro antes de executar o bloco; pode não rodar nenhuma vez. Funciona igual a C, C++, Java, C# e outras linguagens.
bool isDone() => false;
void doSomething() => print("Executar tarefa");
void main() {
while (!isDone()) {
doSomething();
break;
}
}Code language: Dart (dart)
Primeiro avaliamos !isDone(): a função retorna false, a negação vira true, então o bloco interno é executado:
doSomething();
break;
Ao encontrar o break, todo o laço é encerrado e o código após o bloco while é executado. Se isDone() retornasse true, a primeira verificação falharia e o código interno nunca rodaria.
2. do-while
Executa o bloco uma vez sem condição, depois verifica a restrição: garante pelo menos uma execução.
bool atEndOfPage() => true;
void printLine() => print("Imprimir uma linha");
void main() {
do {
printLine();
} while (!atEndOfPage());
}
Code language: Dart (dart)
Independente da condição do while ser true ou false, o código dentro do do {} sempre executa uma vez.
5. break / continue
break
Encerra todo o laço instantaneamente e pula para as linhas seguintes; o restante do bloco não é executado.
bool shutDownRequested() => true;
void processIncomingRequests() => print("Processar requisições");
void main() {
while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}
print("Laço finalizado");
}
Code language: Dart (dart)
continue
Pula todas as linhas restantes da repetição atual e vai direto para a próxima repetição.
Forma tradicional com for
class Candidate {
final int yearsExperience;
Candidate(this.yearsExperience);
void interview() => print("Realizar entrevista");
}
void main() {
var candidates = [Candidate(3), Candidate(6)];
for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue; // Candidatos com menos de 5 anos de experiência são ignorados
}
candidate.interview();
}
}
Code language: Dart (dart)
Alternativa funcional (sem continue)
void main() {
var candidates = [Candidate(3), Candidate(6)];
candidates
.where((c) => c.yearsExperience >= 5)
.forEach((c) => c.interview());
}
Code language: Dart (dart)
6. Rótulo Label para controle de laços aninhados
Sintaxe: colocar nomeRotulo: antes de um laço, usar com break nomeRotulo / continue nomeRotulo
Finalidade: com vários laços aninhados, sair ou pular diretamente o laço externo, não apenas o interno.
1. break + label
Sair de um laço duplo de uma vez
void main() {
outerLoop:
for (var i = 1; i <= 3; i++) {
for (var j = 1; j <= 3; j++) {
print('i = $i, j = $j');
if (i == 2 && j == 2) {
break outerLoop; // Encerrar imediatamente o laço externo marcado outerLoop
}
}
}
print('outerLoop exited');
}
Code language: Dart (dart)
Saída:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Code language: Dart (dart)
2. continue + label
Ir direto para a próxima repetição do laço externo
void main() {
outerLoop:
for (var i = 1; i <= 3; i++) {
for (var j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
continue outerLoop; // Ignora todos os j restantes de i=2 e pula para i=3
}
print('i = $i, j = $j');
}
}
}
Code language: Dart (dart)
Saída:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3
Exemplo while+break+label
void main() {
var i = 1;
outerLoop:
while (i <= 3) {
var j = 1;
while (j <= 3) {
print('i = $i, j = $j');
if (i == 2 && j == 2) {
break outerLoop;
}
j++;
}
i++;
}
print('outerLoop exited');
}
Code language: PHP (php)
Resultado da execução
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Esse mecanismo tem comportamento semelhante ao comando goto de outras linguagens de programação.
Laços Loops