当前位置: 首页 > news >正文

【maaath】 Flutter for OpenHarmony 打车出行应用跨平台实践

Flutter 打车出行应用在 OpenHarmony 上的跨平台实践

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

作者:maaath

一、引言

随着 OpenHarmony 生态的快速发展,跨平台开发框架在鸿蒙设备上的适配成为开发者关注的焦点。Flutter 作为业界领先的跨平台 UI 框架,凭借其高性能渲染引擎和丰富的组件生态,已经成为 OpenHarmony 应用开发的重要选择之一。

本文将基于笔者在实际项目中开发的打车出行应用,详细介绍如何使用 Flutter 在 OpenHarmony 设备上构建一个功能完整的打车应用。该应用涵盖了附近车辆搜索、价格预估比较、预约叫车、行程记录管理、司机评价、紧急求助等核心功能,完整展示了 Flutter 在 OpenHarmony 平台上的开发实践。

本文所有代码均已在 OpenHarmony 设备上验证通过,项目源码托管于 AtomGit:https://atomgit.com

二、项目架构设计

打车出行应用采用经典的分层架构设计,整体分为数据模型层、服务层和 UI 层三个层次:

  • 数据模型层(models):定义车辆类型、司机信息、行程订单、发票等核心数据实体
  • 服务层(services):提供模拟数据生成、业务逻辑处理、状态管理等能力
  • UI 层(pages):基于 Flutter Material Design 构建用户界面,包含打车首页、价格比较、叫车流程、行程记录、紧急求助等页面

这种分层设计使得代码职责清晰、易于维护,同时也方便后续接入真实后端服务。

三、数据模型设计

首先定义打车应用的核心数据模型。我们使用 Dart 的枚举和类来抽象车辆类型、行程状态、司机信息等业务实体。

enumVehicleType{economy,// 经济型comfort,// 舒适型business,// 商务型luxury,// 豪华型carpool,// 拼车}enumRideStatus{searching,// 寻找车辆matched,// 司机已接单arrived,// 司机已到达inProgress,// 行程中completed,// 已完成cancelled,// 已取消}

车辆类型信息使用VehicleTypeInfo类封装,包含基础定价策略:

classVehicleTypeInfo{finalVehicleTypetype;finalStringname;finaldouble basePrice;finaldouble pricePerKm;finaldouble pricePerMinute;constVehicleTypeInfo({requiredthis.type,requiredthis.name,requiredthis.basePrice,requiredthis.pricePerKm,requiredthis.pricePerMinute,});staticconstList<VehicleTypeInfo>allTypes=[VehicleTypeInfo(type:VehicleType.economy,name:'经济型',basePrice:8.0,pricePerKm:1.6,pricePerMinute:0.3,),VehicleTypeInfo(type:VehicleType.comfort,name:'舒适型',basePrice:12.0,pricePerKm:2.2,pricePerMinute:0.4,),VehicleTypeInfo(type:VehicleType.business,name:'商务型',basePrice:18.0,pricePerKm:3.0,pricePerMinute:0.5,),VehicleTypeInfo(type:VehicleType.luxury,name:'豪华型',basePrice:28.0,pricePerKm:4.5,pricePerMinute:0.8,),VehicleTypeInfo(type:VehicleType.carpool,name:'拼车',basePrice:5.0,pricePerKm:1.0,pricePerMinute:0.2,),];}

行程订单模型RideOrder记录了完整的行程信息,包括上下车地点、车辆类型、司机信息、费用明细等。通过copyWith方法实现不可变对象的状态更新,这是 Flutter 中推荐的做法。

四、服务层实现

服务层采用单例模式,提供模拟数据生成和业务逻辑处理能力。以下是附近车辆搜索的核心实现:

classRideService{staticfinalRideService_instance=RideService._();factoryRideService()=>_instance;RideService._(){_initMockDrivers();_initMockLocations();}List<Driver>getNearbyDrivers(double latitude,double longitude,{VehicleType?vehicleType,double radiusKm=3.0,}){return_drivers.where((d){if(!d.isAvailable)returnfalse;if(vehicleType!=null&&d.vehicleType!=vehicleType)returnfalse;finaldistance=_calculateDistance(latitude,longitude,d.latitude,d.longitude,);returndistance<=radiusKm;}).toList();}double_calculateDistance(double lat1,double lng1,double lat2,double lng2,){constr=6371.0;finaldLat=_toRadians(lat2-lat1);finaldLng=_toRadians(lng2-lng1);finala=sin(dLat/2)*sin(dLat/2)+cos(_toRadians(lat1))*cos(_toRadians(lat2))*sin(dLng/2)*sin(dLng/2);finalc=2*atan2(sqrt(a),sqrt(1-a));returndouble.parse((r*c).toStringAsFixed(2));}}

价格预估功能根据里程和时长计算各车型的预估价格,并支持优惠券抵扣:

List<PriceEstimate>getPriceEstimates(double distanceKm,int durationMinutes,){returnVehicleTypeInfo.allTypes.map((info){finalprice=info.basePrice+info.pricePerKm*distanceKm+info.pricePerMinute*durationMinutes;returnPriceEstimate(vehicleType:info.type,estimatedPrice:double.parse(price.toStringAsFixed(2)),estimatedDistance:distanceKm,estimatedDuration:durationMinutes,);}).toList();}

五、UI 层实现

5.1 打车首页与附近车辆搜索

打车首页是用户进入应用的第一界面,包含上车地点选择、目的地输入、附近车辆展示和快捷操作入口。我们使用Timer.periodic实现每 5 秒自动刷新附近车辆列表,模拟实时定位效果。

class_RideHomePageStateextendsState<RideHomePage>{final_rideService=RideService();final_pickupController=TextEditingController();final_dropoffController=TextEditingController();RideLocation?_pickupLocation;RideLocation?_dropoffLocation;List<Driver>_nearbyDrivers=[];Timer?_refreshTimer;@overridevoidinitState(){super.initState();_pickupLocation=_rideService.savedLocations.first;_pickupController.text=_pickupLocation!.name;_refreshNearbyDrivers();_refreshTimer=Timer.periodic(constDuration(seconds:5),(_)=>_refreshNearbyDrivers(),);}void_refreshNearbyDrivers(){if(_pickupLocation==null)return;setState((){_nearbyDrivers=_rideService.getNearbyDrivers(_pickupLocation!.latitude,_pickupLocation!.longitude,);});}}

地点选择采用底部弹出面板(BottomSheet)的设计,展示常用地点和热门目的地,用户点击即可快速填入。

5.2 价格预估比较

价格预估页面展示五种车型的价格对比,按价格从低到高排序,并标注"最实惠"标签。用户可以选择优惠券进行抵扣,实时查看折后价格。

Widget_buildPriceList(ThemeDatatheme){finalsortedEstimates=List<PriceEstimate>.from(_estimates)..sort((a,b)=>a.estimatedPrice.compareTo(b.estimatedPrice));returnListView.builder(padding:constEdgeInsets.all(16),itemCount:sortedEstimates.length,itemBuilder:(context,index){finalestimate=sortedEstimates[index];finaltypeInfo=VehicleTypeInfo.getByType(estimate.vehicleType);finaldiscountedPrice=_getDiscountedPrice(estimate.estimatedPrice);returnContainer(margin:constEdgeInsets.only(bottom:12),decoration:BoxDecoration(color:Colors.white,borderRadius:BorderRadius.circular(16),border:Border.all(color:index==0?Colors.green:Colors.grey.shade200,width:index==0?2:1,),),child:ListTile(leading:Text(typeInfo.icon,style:constTextStyle(fontSize:28)),title:Text(typeInfo.name),subtitle:Text(typeInfo.description),trailing:Column(children:[Text(${discountedPrice.toStringAsFixed(2)}',style:constTextStyle(fontSize:20,fontWeight:FontWeight.bold,),),],),onTap:()=>_confirmRide(estimate.vehicleType,estimate.estimatedPrice),),);},);}

5.3 叫车流程模拟

叫车页面完整模拟了从"寻找车辆"到"行程结束"的完整流程,通过状态机驱动 UI 变化:

// 状态流转:searching -> matched -> arrived -> inProgress -> completed_statusTimer=Timer(constDuration(seconds:3),(){finaldriver=_rideService.matchDriver(order);if(driver!=null&&mounted){setState((){_matchedDriver=driver;_status=RideStatus.matched;_rideService.updateOrderStatus(order.id,RideStatus.matched,driver:driver);});// 后续状态依次推进...}});

每个状态对应不同的 UI 展示:搜索中显示加载动画和等待时间,已接单展示司机信息和车辆详情,行程中显示安全提示,行程结束后提供评价和开票入口。

5.4 紧急求助功能

紧急求助页面是打车应用安全体系的重要组成部分,提供 SOS 一键报警、行程分享、录音取证、快速拍照等安全功能:

classRideEmergencyPageextendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:constText('紧急求助'),backgroundColor:Colors.red,foregroundColor:Colors.white,),body:SingleChildScrollView(child:Column(children:[_buildEmergencyBanner(theme),_buildSOSButton(context,theme),_buildEmergencyContacts(context,contacts,theme),_buildSafetyTips(theme),],),),);}}

SOS 按钮采用醒目的红色圆形设计,点击后弹出确认对话框,确认后模拟拨打 110 并通知紧急联系人。同时提供行程分享、录音取证等辅助安全功能,全方位保障用户出行安全。

5.5 行程记录与评价发票

行程记录页面按状态分类展示所有订单,支持查看详情。在行程详情页中,用户可以对司机进行星级评分和标签评价,也可以申请开具电子发票(支持个人和企业两种类型)。

六、在 OpenHarmony 上的运行效果

以下是在 OpenHarmony 设备上运行该打车应用的截图展示:

截图一:打车首页
展示上车地点选择、目的地输入、附近车辆分布和快捷操作入口。顶部显示"打车出行"标题,右侧提供订单查看和紧急求助入口。

截图二:价格预估比较
展示五种车型的价格对比列表,每种车型显示图标、名称、描述和预估价格,最实惠的车型高亮显示。

截图三:叫车流程
展示司机接单后的信息展示界面,包含司机头像、姓名、评分、车牌号、车辆型号和颜色等信息。

截图四:紧急求助
展示 SOS 一键报警按钮、紧急联系人列表和安全提示信息,红色主题设计醒目突出。

截图五:行程记录
展示按状态分类的行程列表,每条记录包含路线信息、费用和状态标签。

七、项目源码

本文完整项目源码已托管至 AtomGit,欢迎访问获取:

https://atomgit.com

项目结构如下:

lib/ ├── models/ │ └── ride_model.dart # 打车数据模型 ├── services/ │ └── ride_service.dart # 打车服务层 └── pages/ └── ride/ ├── ride_home_page.dart # 打车首页 ├── ride_price_compare_page.dart # 价格预估 ├── ride_booking_page.dart # 叫车流程 ├── ride_order_list_page.dart # 行程记录 ├── ride_order_detail_page.dart # 行程详情 └── ride_emergency_page.dart # 紧急求助

八、总结

本文详细介绍了如何使用 Flutter 在 OpenHarmony 平台上构建一个功能完整的打车出行应用。通过分层架构设计、数据模型抽象、服务层封装和 Material Design UI 构建,我们实现了附近车辆搜索、价格预估比较、预约叫车、行程记录管理、司机评价、紧急求助等核心功能。

Flutter 优秀的跨平台能力和 OpenHarmony 生态的快速发展,为开发者提供了广阔的应用开发空间。希望本文能为正在探索 Flutter for OpenHarmony 开发的读者提供有价值的参考和指导。

欢迎加入开源鸿蒙跨平台社区,共同推动 OpenHarmony 生态繁荣发展:
https://openharmonycrossplatform.csdn.net

http://www.jsqmd.com/news/791330/

相关文章:

  • DRM中‘假偏移’的真相:深入理解DRM_IOCTL_MODE_MAP_DUMB与mmap的协作机制
  • 【SITS 2026权威指南】:AI原生Embedding优化的5大实战技巧,错过将落后语义搜索下一代标准?
  • 手把手教你:开发板直连电脑网口,搞定IP配置和互ping(附虚拟机Ubuntu设置)
  • DBeaver连接CDH集群实战:手把手配置Hive、Impala、Phoenix(含HAWQ与Redis)完整指南
  • 终极免费桌面分区工具:NoFences完整指南,让你的Windows桌面焕然一新
  • 已定!2026年全国青少年信息素养大赛初赛时间安排通知!文末附备赛资料,助力你成功晋级复赛!
  • 跨平台网络资源嗅探下载工具:res-downloader的完整使用指南与实战技巧
  • HDLbits通关秘籍:用计数器+状态机搞定串口接收器(Fsm serialdata),告别冗余状态
  • 点云滤波避坑指南:为什么你的PMF算法效果总不好?可能是这几个参数没搞懂
  • 别再让LLM“编造”非功能需求!SITS 2026强制要求的NFR提取三原则,90%团队至今未通过合规审计
  • 从循环论证到契约论:碳硅文明中认知对齐的法理与哲学基础(世毫九实验室原创研究)
  • 如何免费批量下载抖音无水印视频:douyin-downloader终极指南
  • 开发AI智能体时利用Taotoken聚合多模型能力提升鲁棒性
  • 在Nodejs后端服务中集成Taotoken为前端提供AI能力
  • 长期使用Taotoken Token Plan套餐的成本控制实际感受
  • 机械工程师的Gazebo捷径:用SolidWorks建模,5步搞定你的仿真世界(.world文件生成)
  • 【maaath】 Flutter for OpenHarmony 导航地图应用开发实战
  • 5分钟掌握Translumo:终极实时屏幕翻译工具完全指南
  • Python开发者三步完成Taotoken大模型API接入与调用
  • 别再只盯着IPv4了!用免费DDNS+IPv6实现零成本外网唤醒电脑(移动宽带亲测可用)
  • Taotoken 的 API Key 管理与审计日志功能如何保障调用安全
  • 在团队中统一AI开发环境使用TaoToken CLI一键配置
  • 别再只盯着防火墙了!手把手教你为你的Web应用选择合适的WAF部署模式(透明代理/反向代理/旁路)
  • Claude Code用户如何配置Taotoken解决访问限制问题
  • FunClip终极指南:如何用AI在5分钟内完成专业视频剪辑
  • 完全掌握北航毕业论文LaTeX模板:从理论到实践的专业指南
  • 如何用深度学习精准预测基因剪接变异的影响
  • Python量化工具MOOTDX:通达信数据接口的终极解决方案
  • 3步构建LLM驱动的浏览器自动化:Playwright MCP实战指南
  • 别再傻傻分不清!用Matlab和GNU Radio仿真时,SNR、Eb/N0、Es/N0到底怎么换算?(附代码避坑)