You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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控制器对象而非文本内容,二是没有正确处理结束里程的可空转换。按以下步骤修改:

  1. 转换结束里程为可空Double:使用double.tryParse处理_endingMilesController.text,当输入为空或非数字时,tryParse会返回null,正好匹配“结束里程可为空”的需求。
  2. 修正参数传递:确保传递的是转换后的数值,而非控制器本身。

修改后的完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:07:21