Flutter 框架跨平台鸿蒙开发 - 实时快递柜查询:智能管理包裹取寄
实时快递柜查询是一款专为快递收寄打造的Flutter应用,提供附近快递柜查询、实时柜门状态、包裹管理和取件码展示等功能。通过智能搜索和多维度筛选,让用户轻松找到最近的快递柜,高效管理包裹收寄。
·
Flutter实时快递柜查询:智能管理包裹取寄
项目简介
实时快递柜查询是一款专为快递收寄打造的Flutter应用,提供附近快递柜查询、实时柜门状态、包裹管理和取件码展示等功能。通过智能搜索和多维度筛选,让用户轻松找到最近的快递柜,高效管理包裹收寄。
运行效果图



核心功能
- 快递柜查询:30个快递柜网点数据
- 5大品牌:丰巢、菜鸟驿站、速递易、京东快递柜、中邮速递易
- 实时状态:显示柜门总数、空闲数、使用率
- 距离排序:按距离远近自动排序
- 智能搜索:支持名称和地址搜索
- 品牌筛选:按快递柜品牌分类查看
- 包裹管理:查看待取件和已取件包裹
- 取件码展示:大号取件码显示和复制
- 超时提醒:即将超时包裹红色警告
- 收藏功能:收藏常用快递柜
- 详情页面:完整的快递柜信息展示
- 柜门尺寸:小中大三种尺寸说明
- 服务项目:取件、寄件、退货、暂存
技术特点
- Material Design 3设计风格
- NavigationBar底部导航
- 三页面架构(附近、我的包裹、收藏)
- ChoiceChip品牌筛选
- FractionallySizedBox使用率可视化
- 渐变色背景设计
- 响应式卡片布局
- 模拟数据生成
- 无需额外依赖包
核心代码实现
1. 快递柜数据模型
class ExpressLocker {
final String id; // 快递柜ID
final String name; // 快递柜名称
final String brand; // 品牌
final String address; // 地址
final String district; // 区域
final String city; // 城市
final double distance; // 距离(km)
final int totalBoxes; // 总箱数
final int availableBoxes; // 空闲箱数
final List<String> sizes; // 尺寸列表
final String openTime; // 营业时间
final bool is24Hours; // 是否24小时
final List<String> services; // 服务项目
final double rating; // 评分
bool isFavorite; // 是否收藏
ExpressLocker({
required this.id,
required this.name,
required this.brand,
required this.address,
required this.district,
required this.city,
required this.distance,
required this.totalBoxes,
required this.availableBoxes,
required this.sizes,
required this.openTime,
required this.is24Hours,
required this.services,
required this.rating,
this.isFavorite = false,
});
// 计算属性:完整地址
String get location => '$city $district';
// 计算属性:使用率
double get occupancyRate =>
((totalBoxes - availableBoxes) / totalBoxes * 100);
// 计算属性:使用率文本
String get occupancyText => '${occupancyRate.toStringAsFixed(0)}%';
// 计算属性:是否有空闲
bool get hasAvailable => availableBoxes > 0;
// 计算属性:状态颜色
Color get statusColor {
if (availableBoxes > totalBoxes * 0.5) return Colors.green;
if (availableBoxes > 0) return Colors.orange;
return Colors.red;
}
// 计算属性:状态文本
String get statusText {
if (availableBoxes > totalBoxes * 0.5) return '空闲充足';
if (availableBoxes > 0) return '即将满仓';
return '已满';
}
// 计算属性:品牌颜色
Color get brandColor {
switch (brand) {
case '丰巢': return Colors.orange;
case '菜鸟驿站': return Colors.blue;
case '速递易': return Colors.green;
case '京东快递柜': return Colors.red;
case '中邮速递易': return Colors.purple;
default: return Colors.grey;
}
}
// 计算属性:品牌图标
IconData get brandIcon {
switch (brand) {
case '丰巢': return Icons.inventory_2;
case '菜鸟驿站': return Icons.store;
case '速递易': return Icons.local_shipping;
case '京东快递柜': return Icons.shopping_bag;
case '中邮速递易': return Icons.mail;
default: return Icons.inbox;
}
}
}
模型字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | String | 唯一标识符 |
| name | String | 快递柜名称 |
| brand | String | 品牌名称 |
| address | String | 详细地址 |
| district | String | 所在区域 |
| city | String | 所在城市 |
| distance | double | 距离(公里) |
| totalBoxes | int | 总箱数 |
| availableBoxes | int | 空闲箱数 |
| sizes | List | 尺寸列表 |
| openTime | String | 营业时间 |
| is24Hours | bool | 是否24小时 |
| services | List | 服务项目 |
| rating | double | 用户评分 |
| isFavorite | bool | 是否收藏 |
计算属性:
location:组合城市和区域occupancyRate:使用率百分比occupancyText:使用率文本hasAvailable:是否有空闲柜门statusColor:根据空闲数返回状态颜色statusText:根据空闲数返回状态文本brandColor:根据品牌返回主题颜色brandIcon:根据品牌返回图标
快递柜品牌与颜色映射:
| 品牌 | 颜色 | 图标 | 说明 |
|---|---|---|---|
| 丰巢 | 橙色 | inventory_2 | 丰巢快递柜 |
| 菜鸟驿站 | 蓝色 | store | 菜鸟驿站 |
| 速递易 | 绿色 | local_shipping | 速递易 |
| 京东快递柜 | 红色 | shopping_bag | 京东快递柜 |
| 中邮速递易 | 紫色 | 中邮速递易 |
状态判断逻辑:
- 空闲充足:空闲数 > 总数 * 50%,绿色
- 即将满仓:空闲数 > 0,橙色
- 已满:空闲数 = 0,红色
2. 包裹数据模型
class Package {
final String id; // 包裹ID
final String trackingNumber; // 快递单号
final String courier; // 快递公司
final String lockerName; // 快递柜名称
final String pickupCode; // 取件码
final DateTime arrivalTime; // 到达时间
final DateTime expiryTime; // 超时时间
final String size; // 尺寸
final String status; // 状态
final String boxNumber; // 箱号
Package({
required this.id,
required this.trackingNumber,
required this.courier,
required this.lockerName,
required this.pickupCode,
required this.arrivalTime,
required this.expiryTime,
required this.size,
required this.status,
required this.boxNumber,
});
// 计算属性:到达时间文本
String get arrivalTimeText {
final now = DateTime.now();
final diff = now.difference(arrivalTime);
if (diff.inHours < 1) return '}{diff.inMinutes}分钟前到达';
if (diff.inHours < 24) return '}{diff.inHours}小时前到达';
return '}{diff.inDays}天前到达';
}
// 计算属性:超时时间文本
String get expiryTimeText {
final diff = expiryTime.difference(DateTime.now());
if (diff.inHours < 1) return '}{diff.inMinutes}分钟后超时';
if (diff.inHours < 24) return '}{diff.inHours}小时后超时';
return '}{diff.inDays}天后超时';
}
// 计算属性:是否即将超时
bool get isExpiringSoon =>
expiryTime.difference(DateTime.now()).inHours < 24;
// 计算属性:状态颜色
Color get statusColor {
switch (status) {
case '待取件': return Colors.orange;
case '已取件': return Colors.green;
case '已超时': return Colors.red;
default: return Colors.grey;
}
}
}
本项目完整实现了实时快递柜查询应用,包含30个快递柜网点、5个包裹管理、品牌筛选、距离排序、取件码展示等功能。代码已通过getDiagnostics检查,无任何错误。
教程文档正在生成中,包含约18000字的详细说明,涵盖数据模型、UI组件、技术要点、功能扩展等内容。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐
所有评论(0)