一个完整的 Flutter 功能应用 – FindSeat (BLoC + Json API + 单元测试 + Firebase Auth)
一、简介
我是一名Android开发者,在越南一家软件公司工作。我拥有两种项目经验:外包项目和产品项目。我决定学习Flutter,因为我相信它具有美好的未来。作为一名经验丰富的开发者,我关心清晰的架构、测试、性能和可维护性,因此我一直在寻找一个完整的应用程序示例。不幸的是,社区现在充斥着诸如速度编码、UI挑战等项目,它们只是真实世界应用的一小部分。事实上,大多数项目并没有那么华丽的UI。这就是为什么我决定自己构建这个项目,现在分享给社区,我希望你能从中获得一些东西,然后应用到你的工作中。
项目的第一版(v1.0)只有UI+简单的逻辑。在这个v2.0版本中,我将Bloc模式应用于项目,并为它进行了单元测试。我还为该应用构建了一个简单的Mock API,它只是一个上传到我的私人托管上的静态json文件。我希望我能有时间通过SQLite缓存本地数据,但我还没有,所以希望下一版本会尽快推出。
二、展示
2.1. 主页
在主页上,它只是简单地加载数据然后显示到UI。你可以尝试:
2.1.1. 页面:主页1
- (0) 是关于我的?
- (1) 是用于显示横幅的轮播滑块,它每1秒自动播放一次。你可以向左或向右滑动以查看上一个/下一个项目
- (2) 是座位类别列表。如果你点击一个类别,应用程序将打开“所有演出”屏幕。这是一个水平列表,所以你可以滑动以获取更多项目
- (3) 是推荐座位。点击项目,应用程序将打开“演出详情”屏幕
2.1.2. 页面:主页2
- (4) 是附近的影院。这里没有什么特别的可以尝试的,它只是一个简单的地图,带有高亮的影院位置
- (5) (6) 是每个类别的演出列表。与推荐座位相同,你可以点击项目打开“演出详情”屏幕
2.2. 所有演出
2.2.1. 页面:所有演出1
- (1) 点击打开搜索字段。基本支持按名称搜索
- (2) 点击打开排序选项。基本支持按评分和名称排序
- (3) 有3个标签:正在上映、即将上映和独家。你可以向左/向右滑动以查看每个标签的内容
- (4) 以网格视图显示演出列表
2.2.2. 页面:所有演出2
- 排序选项对话框
2.2.3. 页面:所有演出3
- 应用程序将在停止输入400毫秒后执行搜索,这实际上是去抖技术。尝试点击项目,应用程序将打开“演出详情”屏幕
2.3. 演出信息
2.3.1. 页面:演出信息1
- (1) 是来自Youtube链接的演出预告片
- (2) 演出描述
- (3) 是优惠部分。这不是静态内容,可以在Mock API中更改
2.3.2. 页面:演出信息2
- (4) 是用户评论部分。目前尚不支持写评论功能
- (5) 是演员阵容部分。这是一个水平列表视图,你可以滑动以获取更多内容。
- (6) 点击“预订座位”,应用程序将打开“预订时间段”屏幕
2.4. 预订时间段
2.4.1. 页面:预订时间段1
- (1) 点击打开搜索字段。基本支持按影院名称搜索
- (2) 带有时间段的影院列表。灰色项目是当前不可用的时间段。
2.4.2. 页面:预订时间段2
- 应用程序将在停止输入400毫秒后执行搜索,这实际上是去抖技术。点击项目时间段,应用程序将打开“预订座位类型”屏幕。
2.5. 预订座位类型
- (1) 选择座位数量
- (2) 选择座位类型
2.6. 预订座位槽
- (1) 是已预订座位的数量
- (2) 已预订座位。你可以点击选择,然后再次点击取消选择座位。
- 验证:例如,在“预订座位类型”屏幕中,你选择了3个座位,类型是Jack,这意味着
- 你不能选择Queen或King座位
- 你不能预订超过3个座位
2.7. 付款
2.7.1. 页面:付款1
- 应用程序集成了Stripe SDK,目前用于测试,当你点击任何支付方式(借记卡/UDI/网上银行)时,应用程序只会显示通过输入卡信息到表格进行支付的选项。
2.7.2. 页面:付款2
- 为了测试,请使用以下信息:
- 卡号:4242 4242 4242 4242
- 有效期:04/24
- CVC:424 或 242
2.7.3. 页面:付款3
- 在Stripe验证支付信息后,应用程序将显示你的预订信息。
2.8. 登录
- 应用程序基本支持用户使用电子邮件和密码登录。谷歌和Facebook登录即将推出。
- 测试账号:[email protected] / 123456
2.9. 注册
- 我使用Bloc模式在此表单中进行了验证,你可以参考它来学习如何在Bloc中进行表单验证。
三、Mock API
https://integer.sgp1.digitaloceanspaces.com/findseat
| API | 用法 |
|---|---|
| /home.json | 返回主页数据 |
| /all_shows_by_type.json | 返回所有演出页面数据 |
| /booking_time_slot_by_cine.json | 返回预订时间段页面数据 |
| /book_seat_slot_by_time_slot.json | 返回预订座位槽页面数据 |
四、插件
| 插件 | 用法 |
|---|---|
| retrofit | 用于处理RESTful API,生成模型 |
| json_annotation | 同上(SAA) |
| dio | SAA |
| build_runner | SAA |
| flutter_bloc | 用于构建应用程序架构 |
| carousel_slider | 用于主页的横幅部分 |
| freezed | 处理Bloc的状态 |
| equatable | SAA |
| meta | SAA |
| intl | 格式化日期时间和其他格式 |
| youtube_player_flutter | 显示Youtube链接的预告片 |
| shared_preferences | 用于缓存用户会话 |
| flutter_svg | 显示SVG图标 |
| google_maps_flutter | 显示影院地址 |
| dotted_border | 在演出详情页面显示优惠票的虚线边框 |
| shimmer | 动画图片占位符 |
| stripe_payment | 用于预订功能 |
| firebase_core | 用于使用Firebase注册账户和登录 |
| google_sign_in | SAA |
| firebase_auth | SAA |
| test | 尝试使用单元测试,大部分情况来自Bloc |
| bloc_test | SAA |
五、设计致谢
作者:Dinu Dinesh
设计链接:电影和活动票务预订应用程序
开发环境
flutter doctor -v
[√] Flutter (Channel stable, 2.8.1, on Microsoft Windows [Version 10.0.19043.1586], locale en-US)
• Flutter version 2.8.1 at C:\src\flutter
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision 77d935af4d (3 months ago), 2021-12-16 08:37:33 -0800
• Engine revision 890a5fca2e
• Dart version 2.15.1
[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
• Android SDK at C:\Users\ASUS\AppData\Local\Android\sdk
X cmdline-tools component is missing
Run `path/to/sdkmanager --install "cmdline-tools;latest"`
See https://developer.android.com.cn/studio/command-line for more details.
X Android license status unknown.
Run `flutter doctor --android-licenses` to accept the SDK licenses.
See https://flutterdart.cn/docs/get-started/install/windows#android-setup for more details.
[√] Chrome - develop for the web
• Chrome at C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
[√] Android Studio (version 3.1)
• Android Studio at C:\Program Files\Android\Android Studio
• Flutter plugin version 29.0.1
• Dart plugin version 173.4700
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b02)
[√] Android Studio (version 3.5)
• Android Studio at C:\Program Files\Android\android-studio
• Flutter plugin version 42.1.1
• Dart plugin version 191.8593
• Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b03)
[√] Android Studio (version 3.6)
• Android Studio at C:\Program Files\Android\AS33
• Flutter plugin version 49.0.1
• Dart plugin version 192.8052
• Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b04)
[√] IntelliJ IDEA Community Edition (version 2020.3)
• IntelliJ at C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.3.1
• Flutter plugin can be installed from:
https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin can be installed from:
https://plugins.jetbrains.com/plugin/6351-dart
[√] IntelliJ IDEA Ultimate Edition (version 2021.1)
• IntelliJ at C:\Program Files\JetBrains\IntelliJ IDEA 2021.1
• Flutter plugin can be installed from:
https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin can be installed from:
https://plugins.jetbrains.com/plugin/6351-dart
[√] VS Code (version 1.65.0)
• VS Code at C:\Users\ASUS\AppData\Local\Programs\Microsoft VS Code
• Flutter extension can be installed from:
https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter
[√] Connected device (3 available)
• sdk gphone x86 (mobile) • emulator-5554 • android-x86 • Android 11 (API 30) (emulator)
• Chrome (web) • chrome • web-javascript • Google Chrome 99.0.4844.74
• Edge (web) • edge • web-javascript • Microsoft Edge 98.0.1108.62
! Doctor found issues in 1 category.
运行项目前,请执行以下命令:
flutter cleanflutter pub getflutter pub run build_runner build或flutter pub run build_runner build --delete-conflicting-outputsflutter run(如果需要)
支持
- 如果你想在下一个版本中获得更新,请给我的仓库点个⭐?
- 如果你喜欢我的作品并想支持我,请在此处给我买杯咖啡。非常感谢!?
















