Estou criando um aplicativo de rastreamento de milhagem baseado em um tutorial para um rastreador de despesas. Estou no ponto em que estou tentando criar a função de _submitMileageData() com uma verificação para garantir que pelo menos um Título, Milhagem Inicial e Data sejam selecionados. Não me importa se enteredEndingMiles é nulo ou é 999999. Na maioria das vezes, provavelmente será nulo e será inserido no final do dia e atualizado usando uma função de edição.
O problema é que, quando eu faço a parte widget.onAddMileage, eu obtenho a linha vermelha sob _endingMilesController.text. Eu tentei tudo que eu posso pensar para convertê-lo para um double, mas eu não consigo encontrar a combinação certa de código para fazer isso. Eu até cheguei a tentar criar um 'final endingMilesIsValid = enteredEndingMiles == null ...' e então comecei a obter um erro booleano. Eu tento retificar isso adicionando uma declaração else após minha verificação de erro basicamente dizendo que se as milhas finais forem nulas, apenas retorne. Contanto que ele retorne como um double no final do dia para que o Total de Milhas possa ser calculado, isso é tudo que me importa.
Mas chega de divagações... tenho certeza de que nem expliquei direito, dado o quão frito está meu cérebro... Aqui está o bloco de código em que estou trabalhando.
void _submitMileageData() {
final enteredStartingMiles = double.tryParse(_startingMilesController.text);
final startingMilesIsInvalid =
enteredStartingMiles == null || enteredStartingMiles <= 0;
if (_titleController.text.trim().isEmpty ||
startingMilesIsInvalid ||
_selectedDate == null) {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text('Invalid input.'),
content: Text(
'Please make sure a valid title, starting mileage, or date was entered.'),
actions: [
TextButton(
onPressed: () {
Navigator.pop(ctx);
},
child: Text('Ok'),
),
],
),
);
return;
}
widget.onAddMileage(
Mileage(
title: _titleController.text,
startMileage: enteredStartingMiles,
endMileage: _endingMilesController,
date: _selectedDate!,
category: _selectedCategory,
),
);
}
Agradeço qualquer ajuda ou crítica que vier em minha direção com relação a isso.
Obrigado!
Acho que o problema é quando _endingMilesController.text pode ser nulo ou conter valores inesperados. Uma solução robusta é usar double.tryParse() para converter com segurança o texto para um double. Se double.tryParse() retornar nulo (o que significa que a conversão falhou), atribua um valor padrão, como nulo ou 999999.
Tentar :
Você obtém o erro: "O tipo de argumento 'double?' não pode ser atribuído ao tipo de parâmetro 'double'." Porque
double.tryParse()
retorna double anulável (double?
) "o que significa que pode ser nulo se a análise falhar" E o tipo de parâmetro é double não anulável (double
) "o que significa que ele sempre tem um valor e nunca pode ser nulo".Para corrigir isso, você tem duas opções:
Escolha um valor a ser usado em caso de nulo:
double x = double.tryParse('1.23') ?? 0.0;
Aqui o x duplo não será nulo, mesmo quedouble.tryParse()
retorne nulo, o valor 0.0 será usado.Use o operador de asserção nulo (!), já que você verificou se
enteredStartingMiles == null
e tratou desse caso, nas linhas de código a seguir você pode dizer "confie em mim enteredStartingMiles não é nulo" adicionando (!) no final do nome da variávelenteredStartingMiles!