如何在Flutter里程跟踪应用中允许表单提交空结束里程值?
里程跟踪应用:结束里程的Double类型转换问题
我正在基于费用跟踪应用教程开发里程跟踪应用,当前编写_submitMileageData()函数,要求标题、起始里程和日期为必填项,结束里程允许为空(后续可通过编辑功能补填)。但调用widget.onAddMileage时,_endingMilesController.text无法正确转换为double类型,尝试多种方法均报错,希望找到正确转换方式,确保结束里程可为空且最终能转double计算总里程。
原代码如下:
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, ), ); }
解决方案
核心问题有两个:一是你直接传递了_endingMilesController控制器对象而非文本内容,二是没有正确处理结束里程的可空转换。按以下步骤修改:
- 转换结束里程为可空Double:使用
double.tryParse处理_endingMilesController.text,当输入为空或非数字时,tryParse会返回null,正好匹配“结束里程可为空”的需求。 - 修正参数传递:确保传递的是转换后的数值,而非控制器本身。
修改后的完整代码:
void _submitMileageData() { final enteredStartingMiles = double.tryParse(_startingMilesController.text); // 处理结束里程:空输入或无效输入时返回null final enteredEndingMiles = _endingMilesController.text.trim().isEmpty ? null : double.tryParse(_endingMilesController.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: enteredEndingMiles, // 传递转换后的可空数值 date: _selectedDate!, category: _selectedCategory, ), ); }
额外说明
- 确保你的
Mileage类中endMileage字段的类型是double?(可空Double),否则会出现类型不匹配错误。 - 后续计算总里程时,可以通过空安全操作符处理:
final totalMiles = endMileage != null ? endMileage! - startMileage : null;,这样在结束里程未补填时总里程也会是null,符合业务逻辑。
内容的提问来源于stack exchange,提问作者jbach04
相关产品推荐
相关产品推荐

