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;
    }
  }
}

模型字段说明

字段类型说明
idString唯一标识符
nameString快递柜名称
brandString品牌名称
addressString详细地址
districtString所在区域
cityString所在城市
distancedouble距离(公里)
totalBoxesint总箱数
availableBoxesint空闲箱数
sizesList尺寸列表
openTimeString营业时间
is24Hoursbool是否24小时
servicesList服务项目
ratingdouble用户评分
isFavoritebool是否收藏

计算属性

  • location:组合城市和区域
  • occupancyRate:使用率百分比
  • occupancyText:使用率文本
  • hasAvailable:是否有空闲柜门
  • statusColor:根据空闲数返回状态颜色
  • statusText:根据空闲数返回状态文本
  • brandColor:根据品牌返回主题颜色
  • brandIcon:根据品牌返回图标

快递柜品牌与颜色映射

品牌颜色图标说明
丰巢橙色inventory_2丰巢快递柜
菜鸟驿站蓝色store菜鸟驿站
速递易绿色local_shipping速递易
京东快递柜红色shopping_bag京东快递柜
中邮速递易紫色mail中邮速递易

状态判断逻辑

  • 空闲充足:空闲数 > 总数 * 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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐