Pular para o conteúdo principal

not_assigned_potentially_non_nullable_local_variable

Detalhes sobre o diagnóstico 'not_assigned_potentially_non_nullable_local_variable' produzido pelo analisador do Dart.

The non-nullable local variable '{0}' must be assigned before it can be used.

Descrição

#

O analisador emite este diagnóstico quando uma variável local é referenciada e possui todas estas características:

  • Tem um tipo potencialmente não anulávelPotentially non-nullableUm tipo que é non-nullable explicitamente ou por ser um parâmetro de tipo. Saiba mais.
  • Não tem inicializador.
  • Não está marcada como late.
  • O analisador não consegue provar que a variável local será atribuída antes da referência, com base na especificação de atribuição definitivaDefinite assignmentA determinação de se uma variável recebeu com certeza um valor antes de ser usada. Saiba mais.

Exemplos

#

O código a seguir produz este diagnóstico porque x não pode ter um valor null, mas é referenciada antes de receber um valor atribuído:

dart
String f() {
  int x;
  return x.toString();
}

O código a seguir produz este diagnóstico porque a atribuição a x pode não ser executada, então ela pode ter o valor null:

dart
int g(bool b) {
  int x;
  if (b) {
    x = 1;
  }
  return x * 2;
}

O código a seguir produz este diagnóstico porque o analisador não consegue provar, com base na análise de atribuição definitiva, que x não será referenciada sem que um valor tenha sido atribuído a ela:

dart
int h(bool b) {
  int x;
  if (b) {
    x = 1;
  }
  if (b) {
    return x * 2;
  }
  return 0;
}

Correções comuns

#

Se null for um valor válido, então torne a variável anulável:

dart
String f() {
  int? x;
  return x!.toString();
}

Se null não for um valor válido, e houver um valor padrão razoável, então adicione um inicializador:

dart
int g(bool b) {
  int x = 2;
  if (b) {
    x = 1;
  }
  return x * 2;
}

Caso contrário, garanta que um valor foi atribuído em todos os caminhos possíveis do código antes de o valor ser acessado:

dart
int g(bool b) {
  int x;
  if (b) {
    x = 1;
  } else {
    x = 2;
  }
  return x * 2;
}

Você também pode marcar a variável como late, o que remove o diagnóstico, mas se a variável não receber um valor antes de ser acessada, então uma exceção é lançada em tempo de execução. Essa abordagem só deve ser usada se você tiver certeza de que a variável sempre será atribuída, mesmo que o analisador não consiga provar isso com base na análise de atribuição definitiva.

dart
int h(bool b) {
  late int x;
  if (b) {
    x = 1;
  }
  if (b) {
    return x * 2;
  }
  return 0;
}

Encontrou essa página sem tradução ou que precisa de correção? Abra uma issue e nos ajude a manter esse site em PT-BR para ajudar pessoas como você.