Olá, Fernando. Tudo bem?
A função onChanged pode sim ser usada para atualizar o estado e validar os campos conforme o usuário insere novos dados. Para fazer com que o aviso de erro desapareça assim que o campo é preenchido, você pode chamar a validação do formulário dentro de setState no onChanged, forçando a revalidação.
Vou deixar um exemplo de como eu fiz para o nameController:
Primeiro declarei uma variável booleana para verificar se o campo foi modificado pelo usuário.
bool _nameTouched = false;
A função setState será chamada normalmente em onChanged, mas a validação só será ativada quando o campo for modificado.
Padding(
padding: const EdgeInsets.all(8.0),
child: TextFormField(
validator: (String? value) {
if (_nameTouched && (value == null || value.isEmpty)) {
return 'Insira o nome da tarefa';
}
return null;
},
onChanged: (text) {
setState(() {
_nameTouched = true; // Marca que o campo foi modificado
_formKey.currentState!.validate();
});
},
controller: nameController,
textAlign: TextAlign.center,
decoration: const InputDecoration(
border: OutlineInputBorder(),
hintText: 'Nome',
fillColor: Colors.white70,
filled: true,
),
),
),
Você pode seguir a mesma logica para os outros campos. Vou deixar abaixo um gif demonstrando o meu resuldado.
Espero ter ajudado. Se tiver outras dúvidas, conte sempre com o fórum!
Siga firme nos estudos!
Abraços!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado