flutter3-wetrip跨平台自研仿携程app预约酒店系统模板

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
函数计算FC,每月15万CU 3个月
简介: 基于最新跨平台框架flutter3.x+dart3+getx+flutter_datepicker纯手写实战的一款仿去哪儿/携程旅游酒店预约客房app系统。

2025開年重磅新作-Flutter3.27+Dart3.6+Getx跨平台仿携程/去哪儿旅行app酒店客房预约管理系统。

未标题-12.png

flutter3-trip实现了首页酒店、预订搜索模块、酒店列表/详情、动态、订单、消息、我的等功能。

未标题-1.png

运用技术


  • 技术框架: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


p2.gif

p3.gif

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


p4.gif


项目结构目录


基于最新版跨平台框架flutter3.27搭建项目模板。

360截图20250219213802581.png


p1.gif

001360截图20250218212534775.png 001360截图20250218212752655.png

002360截图20250218213132728.png 003360截图20250218213421652.png

003360截图20250218213557501.png 003360截图20250218213754239.png

004360截图20250218214403031.png 004360截图20250218214520006.png

004360截图20250218214650917.png 004360截图20250218214746151.png

项目主配置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});

  @override
  Widget 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实现如下图指示槽

0c3ae61c613041db8eda93a84948d39b_1289798-20250220115321103-1445930383.png

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,
        ),
      ],
    ),
  ],
),

006360截图20250218215727398.png 006360截图20250218215923111.png

006360截图20250218220131031.png 007360截图20250218220306277.png

008360截图20250218220608479.png 009360截图20250218220758691.png

009360截图20250218220936149.png 009360截图20250218221823068.png

flutter3预订功能模块

8bee4e78a1e3d108a7c594bc944c2524_1289798-20250220115554798-1475737382.png

18baf9653d70e50233897c9b67e26c8c_1289798-20250220115808387-1498483440.png

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


7a13d79acedecb75f1685131b843eb56_1289798-20250220120051983-920799548.png

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

c6a2ae2a48420282d3c58320cf0359b6_1289798-20250220120754032-653196367.png

// 入住日期
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();
  },
),

未标题-cc.png

整个项目涵盖的知识点还是蛮多的,希望上面的分享对大家有所帮助~

目录
相关文章
|
8天前
|
存储 前端开发 API
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
109 5
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
|
8天前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
85 5
|
2月前
|
JSON iOS开发 数据格式
最新研发flutter3.32+window_manager客户端OS管理系统
原创Flutter3.32+Dart3.8+Getx+Window_Manager实战桌面客户端os系统解决方案。支持macOS和windows两种主题风格、自定义桌面栅格布局。
215 49
|
2月前
|
缓存 小程序 开发工具
最新原创uniapp+vue3仿微信界面聊天app系统
最新原创研发uniapp+vue3实战跨端仿微信App界面聊天程序。支持运行到H5+小程序+APP端。
130 5
最新原创uniapp+vue3仿微信界面聊天app系统
|
2月前
|
缓存 小程序 iOS开发
基于uni-app+vue3手机桌面oadmin管理系统
基于uniapp+vue3+pinia2+uv-ui仿ios手机界面oa后台系统解决方案。支持运行到h5+小程序+app端。
137 5
|
2月前
|
安全 测试技术 虚拟化
Omnissa App Volumes 4, version 2506 - 实时应用程序交付系统
Omnissa App Volumes 4, version 2506 - 实时应用程序交付系统
53 0
|
3月前
|
存储 Android开发 数据安全/隐私保护
Thanox安卓系统增加工具下载,管理、阻止、限制后台每个APP运行情况
Thanox是一款Android系统管理工具,专注于权限、后台启动及运行管理。支持应用冻结、系统优化、UI自定义和模块管理,基于Xposed框架开发,安全可靠且开源免费,兼容Android 6.0及以上版本。
182 4
|
5月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
291 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
3月前
|
小程序 Java 关系型数据库
圈子系统公众号app小程序系统源码圈子系统带即时通讯 多级圈子系统源码 兴趣小组系统开源 私密圈子系统代码 会员制社区系统
本圈子系统解决方案提供即时通讯、多级圈子、兴趣小组、私密社区及会员制管理功能。支持开源与商业方案,推荐ThinkSNS+、EasyClub及OpenFire等系统,并提供前后端技术选型建议,助力快速搭建社交平台。
136 0
|
4月前
|
消息中间件 缓存 小程序
婚恋交友相亲公众号app小程序系统源码「脱单神器」婚恋平台全套代码 - 支持快速二次开发
这是一套基于SpringBoot + Vue3开发的婚恋交友系统,支持微信公众号、Uniapp小程序和APP端。系统包含实名认证、智能匹配、视频相亲、会员体系等功能,适用于婚恋社交平台和相亲交友应用。后端采用SpringBoot 3.x与MyBatis-Plus,前端使用Vue3与Uniapp,支持快速部署和二次开发。适合技术团队或有经验的个人创业者使用。
251 8