Flutter+开源鸿蒙实战|城市共享驿站智能存取系统 Day2 全局路由守卫+多实体模型+模拟网点数据+首页列表布局+分类筛选优化

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

<!-- Schema.org 结构化数据 -->
<script type="application/ld+json">
{
  "@context":"https://schema.org",
  "type":"BlogPosting",
  "headline":"Flutter+开源鸿蒙实战 城市共享驿站智能存取系统Day2 全局路由守卫+实体模型+网点模拟数据+首页列表+分类筛选",
  "author":{"type":"Person","name":"鸿蒙跨端开发者"},
  "publisher":{"type":"Organization","name":"开源鸿蒙技术社区"},
  "datePublished":"2026-05-09",
  "description":"脱离校园商业级项目Day2,完善全局路由配置与登录路由守卫、新增驿站/快件/订单多实体模型、构建网点GetX控制器、模拟城市真实驿站数据、完成首页列表布局与分类筛选功能,优化全局UI与底部导航样式,超详细分步讲解+核心代码+新手避坑,适配鸿蒙手机平板全终端",
  "keywords":"Flutter,开源鸿蒙,OpenHarmony,共享驿站,路由守卫,实体模型,网点列表,分类筛选,商业级毕设"
}
</script>

一、前言

哈喽小伙伴们,我们接着城市共享驿站智能存取系统继续往下开发,彻底远离校园类同质化项目,专注城市商圈、小区、写字楼真实便民业务逻辑,做一套真正具备商业落地思维、架构规范、技术点饱满的高级项目。
在这里插入图片描述

Day1我们已经完成了项目从零初始化、企业级目录搭建、第三方依赖集成、用户模型与全局认证控制器、五大业务页面空壳、全局屏幕适配以及底部导航基础架构,把整个项目的底层地基全部打牢。

到了Day2,我们不再只搭空架子,开始落地真实业务逻辑,从架构完善到数据层、再到UI页面层层层推进,每一步都按照企业开发流程来走,不做杂乱无章的页面堆砌。

整篇文章依旧保持你要求的高标准:
语言全程口语化、叙述篇幅饱满,前言铺垫充足、结尾复盘完整;
每一块代码上方都有超详细文字解析,讲清作用、原理和新手易错点;
代码严格控制每段5~6行,精简核心逻辑,不冗余、不堆砌;
结构分点清晰、步骤拆解细致,零基础也能跟着一步步复刻;
全程适配开源鸿蒙手机、平板、智能大屏终端,多端兼容无布局错乱;
每篇配套4张实景运行配图,可直接插入CSDN发布使用。

今天Day2我们要一次性完成架构层、模型层、数据层、页面层四大板块开发,任务量饱满且逻辑层层递进:

  1. 搭建全局路由文件,配置所有页面路由地址,统一管理页面跳转;
  2. 实现路由守卫功能,未登录用户无法进入订单、个人中心等私密页面,自动拦截跳转登录;
  3. 新增驿站模型、快件模型、订单模型,完善整套业务实体结构;
  4. 创建驿站专用GetX控制器,统一管理网点数据、分类筛选逻辑;
  5. 构造真实城市驿站模拟数据,覆盖小区、商圈、写字楼多场景网点;
  6. 重构首页完整UI布局,完成顶部搜索栏、分类标签、驿站列表卡片;
  7. 封装通用驿站列表卡片组件,全局可复用,统一UI风格;
  8. 实现分类筛选功能,点击标签自动筛选对应类型驿站网点;
  9. 全局优化底部导航样式、主题细节,统一APP视觉风格;
  10. 整理Day2开发高频报错问题,逐点分析原因并给出完整解决方案。

二、版块1:创建全局路由常量文件

文字讲解

正规商业项目绝对不能在页面里写死路由字符串,后期页面一多、路由地址改动,要到处改代码,极其麻烦。
我们单独在core目录下新建路由常量文件,把所有页面的路由路径统一定义成静态常量,全局统一调用,后期维护、修改路由只需要改这一个文件,专业度拉满,也能避免手写字符串拼写错误。

class RoutePath {
  static const String home = '/home';
  static const String deposit = '/deposit';
  static const String map = '/map';
  static const String order = '/order';
  static const String mine = '/mine';
}

三、版块2:配置GetX全局路由表

文字讲解

定义好路由常量之后,我们需要在项目入口配置全局路由表,把路由地址和对应页面做绑定。
后续所有页面跳转,都通过路由名称跳转,不用传页面组件,解耦性更强,也为后面做路由守卫打好基础。

GetPageRoute getPages() {
  return GetPageRoute(
    page: () => const GlobalBottomNavBar(),
    name: RoutePath.home,
  );
}

四、版块3:实现全局路由守卫(高级权限控制)

文字讲解

路由守卫是高级项目必备功能,核心作用:未登录用户禁止访问订单、个人中心页面,点击后自动拦截,弹窗提示请先登录,这是真实商业APP标配逻辑。
我们通过GetX路由拦截器,监听页面跳转,判断当前用户登录状态,私密页面做权限拦截,公开页面直接放行。

RouteSettings? routeGuard(RouteSettings settings) {
  final authCtrl = Get.find<AuthController>();
  List<String> needLoginPage = [RoutePath.order, RoutePath.mine];
  if(needLoginPage.contains(settings.name) && !authCtrl.isLogin){
    ToastUtil.show('请先登录');
    return const RouteSettings(name: RoutePath.home);
  }
  return settings;
}

五、版块4:新增驿站业务实体模型

文字讲解

Day1只做了用户模型,今天补齐业务核心模型:驿站网点模型。
包含网点名称、所在区域、类型标签、营业时间、距离、评分、地址详情,完全对标现实生活驿站信息,字段设计贴合真实业务,为首页列表渲染、分类筛选提供数据支撑。

class StationModel {
  final String name;
  final String area;
  final String type;
  final String time;
  final String distance;
  final double score;

  StationModel({
    required this.name, required this.area, required this.type,
    required this.time, required this.distance, required this.score
  });
}

在这里插入图片描述

六、版块5:新增快件&订单实体模型

文字讲解

一个完整的驿站系统,必须有快件寄存模型和订单流水模型。
快件模型记录寄存单号、物品类型、寄存时长;订单模型记录订单编号、金额、状态、创建时间,后续存取件、订单列表全部依赖这两个模型渲染。

// 快件模型
class ExpressModel {
  final String no;
  final String type;
  final int day;
  ExpressModel({required this.no, required this.type, required this.day});
}
// 订单模型
class OrderModel {
  final String orderNo;
  final String money;
  final int status;
  final String time;
  OrderModel({required this.orderNo, required this.money, required this.status, required this.time});
}

七、版块6:创建驿站专属GetX控制器

文字讲解

单独创建驿站控制器,专门负责管理所有驿站原始数据、筛选后数据、当前选中分类三个核心状态。
采用GetX响应式列表,数据一变页面自动刷新,不用写setState,分类筛选、列表渲染全部逻辑收拢在控制器里,UI页面只负责展示,完全解耦。

class StationController extends GetxController {
  final RxList<StationModel> allList = <StationModel>[].obs;
  final RxList<StationModel> filterList = <StationModel>[].obs;
  final RxString selectType = '全部'.obs;
}

八、版块7:初始化模拟城市驿站数据

文字讲解

我们手动构造多条真实风格的驿站模拟数据,覆盖小区驿站、商圈寄存点、写字楼快递柜三种类型,有距离、评分、营业时间区分,模拟真实城市分布场景。
页面初始化自动加载原始数据,默认全部展示,为后续分类筛选准备数据源。

void initStationData() {
  allList.addAll([
    StationModel(name:'城东小区驿站',area:'城东片区',type:'快递寄存',time:'08:00-22:00',distance:'0.6km',score:4.8),
    StationModel(name:'万达商圈寄存点',area:'市中心',type:'临时存放',time:'09:00-23:00',distance:'1.2km',score:4.7),
  ]);
  filterList.assignAll(allList);
}

九、版块8:实现分类筛选核心逻辑

文字讲解

顶部分类标签点击后,根据选中的类型,从原始列表里过滤出对应驿站,赋值给筛选列表,页面自动刷新渲染。
逻辑简单但实用性强,支持全部、快递寄存、临时存放、大件寄存四种标签切换,贴合真实驿站业务分类。

void changeType(String type) {
  selectType.value = type;
  if(type == '全部'){
    filterList.assignAll(allList);
  }else{
    filterList.assignAll(allList.where((e)=>e.type==type));
  }
}

十、版块9:封装通用驿站卡片组件

文字讲解

把列表每一项驿站布局单独封装成公共卡片,统一圆角、阴影、文字排版、评分样式,全局复用。
后期首页、网点地图都能调用这个卡片,不用重复写UI代码,改样式只改一处,全局同步生效。

Widget stationCard(StationModel model) {
  return Card(
    elevation: 3.h,
    borderRadius: BorderRadius.circular(12.r),
    child: Padding(padding: EdgeInsets.all(12.w),
      child: Text(model.name,style: TextStyle(fontSize:15.sp)),
    ),
  );
}

十一、版块10:首页完整布局重构(搜索+分类+列表)

文字讲解

今天彻底把首页从空白骨架重构为完整业务首页:顶部搜索框、中间分类标签栏、下方驿站列表。
外层嵌套滚动组件,适配鸿蒙键盘弹出不挤压页面,列表用Obx监听筛选数据变化,自动刷新UI,多端适配无错乱。
在这里插入图片描述

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text("城市共享驿站")),
    body: SingleChildScrollView(
      child: Column(children: [
        TextField(hintText: "搜索驿站名称"),
        Obx(()=>ListView.builder(shrinkWrap:true,itemCount:ctrl.filterList.length))
      ]),
    ),
  );
}

十二、版块11:新手Day2开发高频问题详解

问题1:路由跳转找不到页面、报路由不存在?

解答:路由常量名称和getPages注册名称必须完全一致,大小写、字符串不能有偏差;跳转必须用路由常量,不要手写字符串。

问题2:分类筛选点击标签,列表不刷新?

解答:筛选后的列表必须用Obx包裹,且赋值要用assignAll,不能直接等于,否则GetX无法监听列表变化。

问题3:列表布局溢出、鸿蒙平板页面挤在一起?

解答:ListView嵌套一定要加shrinkWrap:true、 physics:NeverScrollableScrollPhysics(),外层套SingleChildScrollView,避免高度溢出。

问题4:控制器调用提示找不到实例?

解答:必须在main.dart提前懒加载注册,页面使用Get.find获取,不能直接new创建实例,否则状态无法全局共享。

问题5:实体模型创建后赋值报错?

解答:构造方法必填字段要加required,创建实例时不能缺字段,字段类型要和模型定义完全匹配。

十三、Day2 开发总结

今天Day2完成了项目从底层架构到业务数据再到页面UI的完整进阶升级:
统一全局路由管理、实现高级路由登录守卫、补齐三大业务实体模型、搭建驿站专属控制器、构造真实模拟网点数据、完成首页搜索+分类+列表完整布局、封装全局复用卡片组件、实现分类筛选交互逻辑,同时优化了整体架构规范性。

项目彻底摆脱简单页面堆砌,具备了商业级项目的分层思想、权限控制、数据驱动UI的完整逻辑,含金量远超普通校园类项目。
在这里插入图片描述

十四、下期Day3预告

Day3将开发:智能扫码开箱功能、寄存表单提交、时长计费逻辑、快递柜模拟弹窗、本地缓存保存常用驿站记录、优化列表点击跳转详情页。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐