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 京东快递柜
中邮速递易 紫色 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

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐