flutter3-trip仿携程酒店预订|Flutter3.27+Getx预约旅游酒店App程序

news/2025/2/22 8:12:12/文章来源:https://www.cnblogs.com/xiaoyan2017/p/18726313

基于Flutter3.x+Dart3+GetX跨平台仿携程/飞猪旅行酒店客房预订查询app系统。

flutter3_trip原创2025新版flutter3.27.1+dart3.6+getx+flutter_datepicker跨平台仿携程/飞猪/同程旅游app酒店客房预订系统。实现了首页、酒店预订模块、酒店搜索/列表/详情、探索动态、订单、消息聊天、我的等模块。

技术栈

  • 编辑器:Vscode
  • 技术框架:Flutter3.27.1+Dart3.6.0
  • 路由/状态管理:get: ^4.6.6
  • 本地缓存:get_storage: ^2.1.1
  • 图片轮播组件:card_swiper^3.0.1
  • 日期选择插件:syncfusion_flutter_datepicker^28.2.5
  • 弹层提示:shirne_dialog^4.8.3
  • 瀑布流组件:flutter_staggered_grid_view^0.7.0
  • 滚动定位组件:scrollable_positioned_list^0.3.8

分享几个之前基于flutter3.x跨平台实战项目案例,感兴趣的可以去看看~

flutter3-dymall仿抖音直播商城|Flutter3.27短视频+直播+聊天App实例

flutter3-winchat桌面端聊天实例|Flutter3+Dart3+Getx仿微信Exe程序

flutter3+dart3聊天室|Flutter3跨平台仿微信App语音聊天/朋友圈

酒店预订模块实现了城市地址/位置品牌选择、入住离店日期区间选择、价格/星级筛选等功能。

项目框架结构

基于最新跨平台框架Flutter3.27搭建项目框架,使用Vscode编码开发调试。

目前flutter3-trip酒店预订app项目已经同步到我的作品集,感谢大家的鼓励与支持~

https://gf.bilibili.com/item/detail/1107864011

Flutter3入口配置main.dart

/// 入口文件main.dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:shirne_dialog/shirne_dialog.dart';import 'utils/common.dart';// 引入布局页面
import 'layouts/index.dart';// 引入路由配置
import 'router/index.dart';void main() async {// 初始化get_storage存储
  await GetStorage.init();// 初始化国际化语言initializeDateFormatting('zh_CN');runApp(const App());
}class App extends StatelessWidget {const App({super.key});@overrideWidget build(BuildContext context) {return GetMaterialApp(title: 'Flutter3 Trip',debugShowCheckedModeBanner: false,theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Color(0xFF006ff6)),useMaterial3: true,// 修正windows下字体不一致情况fontFamily: Platform.isWindows ? 'Microsoft YaHei' : null),home: const Layout(),// 初始化路由initialRoute: Common.isLogin() ? '/' : '/login',// 路由页面
      getPages: routePages,// 初始化弹窗key
      navigatorKey: MyDialog.navigatorKey,);}
}

flutter3自定义滚动指示槽

 如上图:首页的分类滚动指示槽采用 SingleChildScrollView 配置 Stack 组件实现功能。

late ScrollController indicatorController = ScrollController();
// 滚动位置
double indicatorOffset = 0;@override
void initState() {super.initState();indicatorController.addListener(() {setState(() {indicatorOffset = indicatorController.position.pixels / indicatorController.position.maxScrollExtent;});});...
}Column(children: [Expanded(child: SingleChildScrollView(controller: indicatorController,scrollDirection: Axis.horizontal,child: Row(...),),),// 指示槽
    Stack(children: [Container(decoration: BoxDecoration(color: Color(0xFFE1EFFF),borderRadius: BorderRadius.circular(50.0),),height: 4.0,width: 50.0,),Container(margin: EdgeInsets.only(left: indicatorOffset * 30.0),decoration: BoxDecoration(color: Color(0xFF006ff6),borderRadius: BorderRadius.circular(50.0),),width: 20.0,height: 4.0,),],),],
),

flutter3实现酒店预订模块

由于预订模块功能点比较多,单独抽离了一个组件。

预订模块支持热门城市/位置品牌选择、入住离店日期区间、价格/星级等功能。

如上图:使用了 scrollable_positioned_list 组件实现滑动字母索引滚动到指定列表位置。

ItemScrollController itemScrollController = ItemScrollController();ScrollablePositionedList.builder(itemScrollController: itemScrollController,itemCount: citylist.length,itemBuilder: (context, index) {// ...
  }
)// 侧边索引
Align(alignment: Alignment.centerRight,child: GestureDetector(child: Container(color: Colors.transparent,width: 25.0,child: Column(mainAxisSize: MainAxisSize.min,mainAxisAlignment: MainAxisAlignment.center,children: List.generate(pinyinList.length, (index) {return GestureDetector(child: Container(...),onTapDown: (details) {// 跳转指定索引位置
              itemScrollController.jumpTo(index: index);setState(() {selectedLetter = pinyinList[index];showBubble = true;});Future.delayed(Duration(milliseconds: 200), () {setState(() {selectedLetter = '';showBubble = false;});});},);}),),),onVerticalDragUpdate: (details) {updateSelectedLetter(details.localPosition);},onVerticalDragEnd: (details) {setState(() {selectedLetter = '';showBubble = false;});},),
),

日期区间选择使用 syncfusion_flutter_datepicker 插件。

// 入住日期
DateTime startDate = DateTime.now();
// 离店日期
DateTime endDate = DateTime.now().add(Duration(days: 1));GestureDetector(child: Container(padding: EdgeInsets.all(10.0),decoration: BoxDecoration(border: Border(bottom: BorderSide(color: Color(0xfff5f5f5))),),child: Row(spacing: 10.0,children: [Icon(Icons.calendar_month_outlined),Expanded(child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [Column(crossAxisAlignment: CrossAxisAlignment.start,spacing: 3.0,children: [Text('入住', style: TextStyle(color: Colors.grey, fontSize: 12.0)),Text('${DateFormat('MM-dd').format(startDate)} ${DateFormat('E', 'zh_CN').format(startDate)}'),],),Container(color: Colors.grey[50],padding: EdgeInsets.symmetric(horizontal: 5.0, vertical: 1.0),// DateTime 类提供了 difference 方法,可以计算两个日期之间的时间差,返回一个 Duration 对象。通过 Duration 的 inDays 属性,可以获取天数差。child: Text('共${endDate.difference(startDate).inDays}晚'),),Column(crossAxisAlignment: CrossAxisAlignment.end,spacing: 3.0,children: [Text('离店', style: TextStyle(color: Colors.grey, fontSize: 12.0)),Text('${DateFormat('MM-dd').format(endDate)} ${DateFormat('E', 'zh_CN').format(endDate)}'),],),],),),Icon(Icons.arrow_forward_ios_rounded, color: Colors.grey, size: 12.0,)],),),onTap: () {handleCalendar();},
),
void handleCalendar() {showModalBottomSheet(backgroundColor: Colors.white,shape: RoundedRectangleBorder(borderRadius: BorderRadius.vertical(top: Radius.circular(0.0))),context: context,builder: (BuildContext context) {return Column(children: [Expanded(child: SfDateRangePicker(selectionMode: DateRangePickerSelectionMode.range,selectionShape: DateRangePickerSelectionShape.rectangle,// 初始日期范围
              initialSelectedRange: PickerDateRange(startDate, endDate),minDate: DateTime.now(),maxDate: DateTime.now().add(Duration(days: 450)),backgroundColor: Colors.white,// 日期区间颜色startRangeSelectionColor: Color(0xFF006ff6),endRangeSelectionColor: Color(0xFF006ff6),rangeSelectionColor: Color(0xFFe3f0f9),// 选中颜色selectionColor: Color(0xFF006ff6),rangeTextStyle: TextStyle(color: Color(0xFF006ff6)),monthViewSettings: DateRangePickerMonthViewSettings(// 改变一周的第一天firstDayOfWeek: 1,viewHeaderStyle: DateRangePickerViewHeaderStyle(textStyle: TextStyle(color: Color(0xFF130438), fontSize: 12, fontFamily: 'Arial'),),dayFormat: 'EE',),// 自定义头部样式
              headerStyle: DateRangePickerHeaderStyle(backgroundColor: Colors.white,textAlign: TextAlign.center),// 日期单元格样式
              monthCellStyle: DateRangePickerMonthCellStyle(cellDecoration: BoxDecoration(// color: Color(0xFFf7f4ff),
                ),todayTextStyle: TextStyle(color: Color(0xFF006ff6)),disabledDatesTextStyle: TextStyle(color: Colors.black26),weekendTextStyle: TextStyle(color: Colors.red.withAlpha(200)),),// showTodayButton: true,// showActionButtons: true,
              onSelectionChanged: (DateRangePickerSelectionChangedArgs args) {setState(() {if(args.value.startDate != null && args.value.endDate != null) {startDate = args.value.startDate;endDate = args.value.endDate;Future.delayed(Duration(seconds: 1), () {Get.back();});}});},),),],);},);
}

flutter3实现酒店列表筛选功能

筛选下拉框采用自定义组件实现功能,搭配 SizeTransition 和 FadeTransition 组件实现下拉动画效果。

// 筛选下拉框
if(dropdownVisible)
Positioned(top: dropdownOffset,height: MediaQuery.of(context).size.height - dropdownOffset,width: MediaQuery.of(context).size.width,child: ScrollConfiguration(behavior: CustomScrollBehavior(),child: Material(color: Colors.transparent,child: Column(children: [SizeTransition(sizeFactor: animation, // 高度展开动画axis: Axis.vertical, // 垂直方向展开
            child: Container(color: Colors.white,width: double.infinity,child: Column(crossAxisAlignment: CrossAxisAlignment.start,children: [if(dropdownIndex == 0)dropOption1(),if(dropdownIndex == 1)dropOption2(),if(dropdownIndex == 2)dropOption3(),if(dropdownIndex == 3)dropOption4(),],),),),Expanded(child: FadeTransition(opacity: animation,child: GestureDetector(child: Container(color: Colors.black54,),onTap: () {setState(() {closeDropdown();});},),),),],),),),
),

flutter3聊天客服消息模块

项目整合进了flutter3实现聊天功能模块。

  

flutter3+dart3聊天室|Flutter3跨平台仿微信App语音聊天/朋友圈

项目中新增的消息聊天模块。这部分功能是之前开发的一款flutter3.x仿微信app聊天功能的精简版。

综上就是Flutter3.27跨平台实战携程酒店预订app应用的一些知识分享,整个项目知识点还是蛮多的,希望上述分享对大家有所帮助!最后感谢大家的阅读与支持~

附上几个原创跨平台项目实例

uniapp+vue3聊天室|uni-app+vite4+uv-ui跨端仿微信app聊天语音/朋友圈

Electron32-ViteOS桌面版os系统|vue3+electron+arco客户端OS管理模板

flutter3-dymall仿抖音直播商城|Flutter3.27短视频+直播+聊天App实例

flutter3-winchat桌面端聊天实例|Flutter3+Dart3+Getx仿微信Exe程序

Electron31-Vue3Admin管理系统|vite5+electron+pinia桌面端后台Exe

Vite5+Electron聊天室|electron31跨平台仿微信EXE客户端|vue3聊天程序

uniapp+vue3酒店预订|vite5+uniapp预约订房系统模板(h5+小程序+App端)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887110.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux应用】Linux服务器访问不了外网如何安装软件?

大多数服务器都是在隔离的网络环境中,服务器被限制访问互联网。原因当然是出于安全考虑,一旦服务器有外网访问能力,中毒后会主动更新病毒库。比如各种广告、XX全家桶就是这么来的。 那如果想在服务器上安装软件怎么办❓ 可能有人会说先提前下载好,再传上去不就行了嘛。这对…

国产免费的网络监控与分析系统工具

科来网络分析系统(CSNAS)是一款集数据包采集、协议解码、流量分析、故障诊断、安全检测等功能于一体的专业网络管理工具。其核心能力包括实时监控网络流量、识别异常行为、还原会话数据流以及提供多维度性能分析,帮助用户快速定位网络故障、优化性能并提升安全性。 系统要求…

本地md博客自动化上传博客园

该工具会在你这个文档同一目录下生成一个`xxx-cnblog.md`文件,这个就是在他自动帮你上传了图片后,替换了你本地图片的路径,替换为cnblog的图床url路径。前言叠甲:先帮博客园免费打个广告,要用这个方法也往博客园发文喔~ 我的博客园:https://www.cnblogs.com/dhan 需求 经…

cpu的核心数和线程数

在windows操作系统下,想看看自己cpu的核数,我打开任务管理器-性能-CPU,看到我的cpu是2核。 然后,我打开计算机管理-设备管理器-处理器,发现这里显示四个cpu信息,但这四个不是内核数,是线程数。一、概念: 1. 核心数(Cores):CPU实际的物理核心数量,比如双核、四核、六…

WebService服务需要通过注册路由进行转发到自身的asmx页面问题

背景要求 三方接口自定义了url路径,但是原先代码是通过webservice进行开发的asmx页面。 前面已经有人写好了代码,但是本地部署死活无法通过注册的路由调用! `protected void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes);}/// <su…

mysql 页存储分布

前言 前文我们已经明白了行数据,如何在页存储中分布的行是怎么存储的。 正文 那么页结构又是怎么样的呢?这里我们唯一知道的就是user records 就是实际存储的行记录内容。这里让我觉得有意思的是infimum 和 suprenum,分别是最小记录和最大记录,这两个是用来做什么呢? 我估…

惠州某全球知名玩具工厂牵手珠海盈致 1个月时间快速迈向精益生产

在竞争激烈的市场环境下,惠州某全球知名玩具工厂为求发展,对仿真火车模型车间进行升级改造,致力于打造更高效、更优质的生产环境。该工厂顺应市场趋势牵手珠海盈致STC-X柔性智能线+MES系统,让该车间仅用1个月正式投产,实现精益生产,实现生产过程的透明化和精细化管理。改…

记一次若依分页total总数返回错误问题解决方案

如上图,在使用若依框架分页时,我对返回的list进行了单独处理,然后发现返回的total字段为10,也就是只返回了当前页的总数。 解决方案是修改genDataTable方法,把流处理过的list带到genDataTable方法中,在setTotal设置oldlist(未进流处理的list总数)原因是在经过处理后的lis…

sql统计最大连续增加条数

趋势特征是业务人员比较青睐的特征,其中涉及到连续变化期数,例如连续增大、减少期数等。这里写一下可以实现的思路。 1.使用变量 这个方法在我常用的sql平台中只有mysql支持。pgsql和hive无法实现。 在查询里声明select @var:=0,通过逻辑语句将起始位置置1,连续行处递增,和…

安川机器人维修SGMAV-A5ANA-YR13伺服电机

在工业自动化领域,安川机器人扮演着至关重要的角色。而其中的SGMAV - A5ANA - YR13伺服电机一旦出现故障,将会影响整个安川机器人的正常运作。 安川机器人SGMAV - A5ANA - YR13伺服电机常见故障一、电气故障线路连接问题在维修中,常常会发现线路松动或者短路的情况。这可能是…

Azure AI Foundry实验室

微软Azure AI Foundry实验室(https://ai.azure.com/labs)旨在通过实验性技术,加速AI创新应用,推动从概念探索到实际解决方案的转化。其聚焦领域包括游戏开发、极端天气预测、药物发现、材料科学、自动化交互等,并强调社区协作以促进技术落地。原文核心实验项目与技术1.Muse定…

ABB机器人维修DSQC1000主机故障

在工业生产领域,ABB机器人发挥着至关重要的作用。然而,像DSQC1000主机这样的关键部件也可能会出现故障,需要进行维修。 一、ABB机器人DSQC1000主机故障的常见表现(1)通讯故障在ABB机器人系统中,DSQC1000主机如果出现通讯故障,可能导致机器人无法接收正确的指令。这时候,…