Flutter 框架跨平台鸿蒙开发 - 油耗记录应用

油耗记录应用


欢迎加入开源鸿蒙跨平台社区:

https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图




1.1 应用简介

油耗记录是一款专注于车辆油耗管理的移动应用,旨在帮助车主记录和分析车辆加油数据,掌握油耗变化趋势,实现智能化的用车成本管理。应用以蓝色为主色调,传递专业、可靠的品牌形象。

应用支持多车辆管理,可记录每次加油的里程、油量、金额、加油站等信息,自动计算百公里油耗,并通过图表直观展示油耗趋势和花费分布,帮助车主优化驾驶习惯,降低用车成本。

1.2 核心功能

功能模块 功能描述 实现方式
加油记录 记录加油信息 表单输入
油耗计算 自动计算百公里油耗 公式计算
统计分析 油耗趋势和花费分析 图表展示
多车管理 支持多辆车辆管理 车辆列表
数据备份 云端数据备份恢复 数据导出

1.3 数据指标

指标名称 计算公式 说明
百公里油耗 加油量 ÷ 行驶里程 × 100 核心油耗指标
平均油耗 各次油耗的平均值 整体油耗水平
总花费 各次加油金额之和 累计加油支出
平均油价 各次油价的平均值 油价趋势参考

1.4 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
状态管理 setState -
目标平台 鸿蒙OS / Web API 21+

1.5 项目结构

复制代码
lib/
└── main_fuel_tracker.dart
    ├── FuelTrackerApp          # 应用入口
    ├── Vehicle                 # 车辆数据模型
    ├── FuelRecord              # 加油记录模型
    ├── MainHomePage            # 主页面(底部导航)
    ├── HomePage                # 首页
    ├── RecordsPage             # 记录列表页面
    ├── StatisticsPage          # 统计分析页面
    ├── ProfilePage             # 个人中心页面
    ├── FuelRecordCard          # 记录卡片组件
    └── AddRecordSheet          # 添加记录表单

二、系统架构

2.1 整体架构图

Data Layer
Presentation Layer
主页面

MainHomePage
首页
记录列表
统计分析
个人中心
车辆信息
最近记录
油耗趋势
记录筛选
记录卡片
关键指标
油耗分布
月度花费
车辆管理
数据备份
Vehicle

车辆模型
FuelRecord

记录模型

2.2 类图设计

manages
manages
displays
displays
lists
analyzes
creates
FuelTrackerApp
+Widget build()
Vehicle
+String id
+String name
+String plateNumber
+String brand
+String model
+String emoji
+double totalMileage
+String fuelType
FuelRecord
+String id
+String vehicleId
+DateTime date
+double mileage
+double liters
+double price
+double unitPrice
+String station
+String fuelType
+double previousMileage
+String note
+double consumption
MainHomePage
-int _currentIndex
-List<Widget> _pages
+Widget build()
HomePage
+Widget build()
+void _showAddRecordDialog()
RecordsPage
-String _selectedVehicleId
+Widget build()
StatisticsPage
+Widget build()
AddRecordSheet
-TextEditingController _litersController
-TextEditingController _priceController
-TextEditingController _mileageController
+Widget build()

2.3 页面导航流程

首页
记录
统计
我的
应用启动
主页面
底部导航
首页展示
记录列表页面
统计分析页面
个人中心页面
点击添加按钮
添加记录表单
保存记录
筛选车辆
查看记录列表
点击添加
查看统计数据
油耗分布
月度花费

2.4 数据流向图

数据 表单 首页 用户 数据 表单 首页 用户 查看油耗统计 获取加油记录 返回记录列表 计算平均油耗 展示统计数据 点击添加记录 弹出添加表单 填写加油信息 验证数据 保存记录 保存成功 显示成功提示


三、核心模块设计

3.1 数据模型设计

3.1.1 车辆模型 (Vehicle)
dart 复制代码
class Vehicle {
  final String id;              // 唯一标识
  final String name;            // 车辆名称
  final String plateNumber;     // 车牌号
  final String brand;           // 品牌
  final String model;           // 型号
  final String emoji;           // 表情图标
  final double totalMileage;    // 总里程
  final String fuelType;        // 油品类型
}
3.1.2 加油记录模型 (FuelRecord)
dart 复制代码
class FuelRecord {
  final String id;              // 唯一标识
  final String vehicleId;       // 车辆ID
  final DateTime date;          // 加油日期
  final double mileage;         // 当前里程
  final double liters;          // 加油量(升)
  final double price;           // 总金额
  final double unitPrice;       // 单价
  final String station;         // 加油站
  final String fuelType;        // 油品类型
  final double? previousMileage; // 上次里程
  final String note;            // 备注
  
  // 计算百公里油耗
  double get consumption {
    if (previousMileage == null) return 0;
    return liters / (mileage - previousMileage!) * 100;
  }
}
3.1.3 油耗计算公式

百公里油耗=加油量(升)本次里程−上次里程×100 百公里油耗 = \frac{加油量(升)}{本次里程 - 上次里程} \times 100 百公里油耗=本次里程−上次里程加油量(升)×100

平均油耗=∑i=1n油耗in 平均油耗 = \frac{\sum_{i=1}^{n} 油耗_i}{n} 平均油耗=n∑i=1n油耗i

3.2 页面结构设计

3.2.1 主页面布局

MainHomePage
IndexedStack
首页
记录列表
统计分析
个人中心
NavigationBar
首页 Tab
记录 Tab
统计 Tab
我的 Tab

3.2.2 首页结构

首页
头部区域
统计卡片
最近加油
油耗趋势
添加按钮
渐变背景
当前车辆
平均油耗
本月花费
记录卡片列表
柱状图

3.2.3 统计页面结构

统计页面
车辆信息卡
关键指标
油耗分布
月度花费
总里程
总加油
总花费
平均油耗
平均油价
加油次数
平均单次
油耗区间分布
月度花费柱状图


四、UI设计规范

4.1 配色方案

应用采用蓝色为主色调,传递专业、可靠的品牌形象:

颜色类型 色值 用途
主色 #1565C0 (Blue) 导航、强调元素
渐变起始 #1565C0 头部渐变
渐变结束 #42A5F5 头部渐变
成功色 #4CAF50 优秀油耗
警告色 #FF9800 一般油耗
背景色 #F5F5F5 页面背景

4.2 字体规范

元素 字号 字重 颜色
页面标题 20px Medium #000000
金额数字 18px Bold #000000
油耗指标 28px Bold 主题色
描述文字 12px Regular #757575

4.3 组件规范

4.3.1 加油记录卡片
复制代码
┌─────────────────────────────────────────┐
│ ┌────┐  ¥318.75              8.5L/100km │
│ │ ⛽ │  2024-01-15                        │
│ └────┘                                    │
│ ⛽ 42.5L   🚗 45680km   💰 ¥7.50/L       │
│ 📍 中石化杭州西湖加油站                   │
└─────────────────────────────────────────┘
4.3.2 统计指标卡片
复制代码
┌─────────────────────┐
│ ⛽ 平均油耗          │
│                     │
│    7.8 L/100km      │
│                     │
│   [优秀]            │
└─────────────────────┘
4.3.3 油耗趋势图
复制代码
┌─────────────────────────────────────────┐
│  8.5                                    │
│  █                                      │
│  █  7.8                                 │
│  █  █     8.2                           │
│  █  █  █  █     7.5                     │
│  █  █  █  █  █  █                       │
│ 1/1 1/8 1/15 ...                        │
└─────────────────────────────────────────┘

五、核心功能实现

5.1 油耗计算实现

dart 复制代码
double get consumption {
  if (previousMileage == null || previousMileage == mileage) return 0;
  return liters / (mileage - previousMileage!) * 100;
}

5.2 添加记录表单实现

dart 复制代码
class AddRecordSheet extends StatefulWidget {
  @override
  State<AddRecordSheet> createState() => _AddRecordSheetState();
}

class _AddRecordSheetState extends State<AddRecordSheet> {
  final _litersController = TextEditingController();
  final _priceController = TextEditingController();
  final _mileageController = TextEditingController();
  DateTime _selectedDate = DateTime.now();
  String _fuelType = '92#';

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(
        bottom: MediaQuery.of(context).viewInsets.bottom + 20,
      ),
      child: Column(
        children: [
          TextField(controller: _litersController, ...),
          TextField(controller: _priceController, ...),
          TextField(controller: _mileageController, ...),
          // 日期选择器
          // 油品类型选择
          FilledButton(onPressed: _saveRecord, child: Text('保存记录')),
        ],
      ),
    );
  }
}

5.3 油耗趋势图表实现

dart 复制代码
Widget _buildConsumptionChart(List<FuelRecord> records) {
  final chartRecords = records.take(6).toList().reversed.toList();
  final maxConsumption = chartRecords.fold<double>(
    0, 
    (max, r) => r.consumption > max ? r.consumption : max
  );
  
  return Row(
    children: chartRecords.map((record) {
      final height = maxConsumption > 0 
        ? (record.consumption / maxConsumption * 100) 
        : 0;
      return Expanded(
        child: Column(
          children: [
            Text(record.consumption.toStringAsFixed(1)),
            Container(
              height: height.clamp(10.0, 100.0).toDouble(),
              decoration: BoxDecoration(
                gradient: LinearGradient(
                  colors: [Colors.blue.shade400, Colors.blue.shade600],
                ),
              ),
            ),
            Text('${record.date.month}/${record.date.day}'),
          ],
        ),
      );
    }).toList(),
  );
}

5.4 统计计算实现

dart 复制代码
// 计算总加油量
final totalLiters = vehicleRecords.fold<double>(0, (sum, r) => sum + r.liters);

// 计算总花费
final totalCost = vehicleRecords.fold<double>(0, (sum, r) => sum + r.price);

// 计算平均油耗
final avgConsumption = vehicleRecords.isEmpty 
  ? 0.0 
  : vehicleRecords.map((r) => r.consumption).reduce((a, b) => a + b) / vehicleRecords.length;

// 计算平均油价
final avgPrice = vehicleRecords.isEmpty 
  ? 0.0 
  : vehicleRecords.map((r) => r.unitPrice).reduce((a, b) => a + b) / vehicleRecords.length;

六、交互设计

6.1 添加记录流程

数据 表单 首页 用户 数据 表单 首页 用户 点击添加按钮 弹出底部表单 输入加油量 输入金额 输入里程 选择日期 选择油品 点击保存 保存记录 保存成功 显示成功提示

6.2 统计分析流程

进入统计页面
加载车辆数据
加载加油记录
计算关键指标
生成油耗分布
生成月度花费
展示统计结果

6.3 数据筛选流程

选择车辆
显示结果
清除筛选
切换车辆
全部车辆
筛选中
已筛选


七、扩展功能规划

7.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 加油记录 油耗计算 统计分析 多车管理 数据备份 油价提醒 导出报表 加油站导航 保养提醒 AI分析 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 油耗记录应用开发计划

7.2 功能扩展建议

7.2.1 智能提醒功能

增强用户体验:

  • 油价变动提醒
  • 保养周期提醒
  • 年检到期提醒
7.2.2 数据分析功能

深度数据分析:

  • 驾驶习惯分析
  • 油耗预测
  • 费用预算
7.2.3 社交分享功能

用户交流平台:

  • 油耗排行榜
  • 省油技巧分享
  • 加油站评价

八、注意事项

8.1 开发注意事项

  1. 数据模型:FuelRecord模型包含油耗计算属性

  2. 里程记录:需要记录上次里程才能计算油耗

  3. 数据验证:加油量和金额必须为正数

  4. 精度处理:油耗保留一位小数

8.2 常见问题

问题 原因 解决方案
油耗为0 缺少上次里程 确保连续记录
数据异常 输入错误 添加数据验证
图表不显示 记录不足 至少需要2条记录
金额计算错误 单价乘积误差 使用精确计算

8.3 使用提示

⛽ 省油小贴士 ⛽

平稳驾驶:避免急加速和急刹车。

合理胎压:保持标准胎压减少阻力。

定期保养:保持发动机良好状态。

减轻负重:清理车内不必要的物品。


九、运行说明

9.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+

9.2 运行命令

bash 复制代码
# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_fuel_tracker.dart --web-port 8101

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_fuel_tracker.dart

# 运行到Windows
flutter run -d windows -t lib/main_fuel_tracker.dart

# 代码分析
flutter analyze lib/main_fuel_tracker.dart

十、总结

油耗记录应用通过系统化的加油数据管理,为车主提供了一个便捷的油耗追踪工具。应用支持多车辆管理,可记录每次加油的详细信息,自动计算百公里油耗,并通过图表直观展示油耗趋势和花费分布。

核心功能涵盖加油记录、油耗计算、统计分析、多车管理四大模块。加油记录支持输入加油量、金额、里程、加油站等信息;油耗计算自动根据里程差计算百公里油耗;统计分析提供油耗分布和月度花费图表;多车管理支持添加和切换不同车辆。

应用采用Material Design 3设计规范,以蓝色为主色调,界面专业简洁。通过本应用,希望能够帮助车主掌握油耗变化,优化驾驶习惯,降低用车成本。

智能管理,省钱省心

相关推荐
2301_822703202 小时前
开源鸿蒙跨平台Flutter开发:血氧饱和度数据降噪:基于滑动窗口的滤波算法优化-利用动态列队 (Queue) 与时间窗口平滑光电容积脉搏波 (PPG)
算法·flutter·华为·开源·harmonyos
独特的螺狮粉2 小时前
开源鸿蒙跨平台Flutter开发:应对重症监护警报疲劳:BLoC 架构下的 FSM (有限状态机) 建模与全局消息干预机制
开发语言·flutter·华为·开源·harmonyos
i-阿松!2 小时前
ESP32-PCB已经通了
物联网·flutter·esp32·go语言
梁山好汉(Ls_man)2 小时前
鸿蒙_ArkUI自定义组件常用的三组状态装饰器
华为·harmonyos·arkts·鸿蒙·arkui
云和数据.ChenGuang2 小时前
#星光计划4.0#鸿蒙界面设计技术解析与实战案例
华为·harmonyos
梁山好汉(Ls_man)2 小时前
鸿蒙_关于自定义组件和自定义构建函数的个人理解
开发语言·华为·typescript·harmonyos·鸿蒙
独特的螺狮粉2 小时前
开源鸿蒙跨平台Flutter开发:跨越 OOM 内存崩溃陷阱:基于 async* Generator 与流式 I/O 的生命科学数据底座构筑
开发语言·flutter·开源·harmonyos
2301_822703202 小时前
开源鸿蒙跨平台Flutter开发:跨越状态同步的鸿沟:医疗终端环境下的数据流转与架构哲学
flutter·开源·harmonyos
C雨后彩虹2 小时前
箱子之字形摆放
java·数据结构·算法·华为·面试