{"id":13685397,"url":"https://github.com/KhoaSuperman/findseat","last_synced_at":"2025-05-01T04:31:05.880Z","repository":{"id":41350377,"uuid":"237636607","full_name":"KhoaSuperman/findseat","owner":"KhoaSuperman","description":"A Completed Functional Flutter App - FindSeat (BLoC + Json API + Unit Test + Firebase Auth)","archived":false,"fork":false,"pushed_at":"2022-03-20T17:36:58.000Z","size":14894,"stargazers_count":1208,"open_issues_count":3,"forks_count":354,"subscribers_count":54,"default_branch":"master","last_synced_at":"2025-04-09T08:06:31.598Z","etag":null,"topics":["clean-architecture","flutter","flutter-app","flutter-apps","flutter-demo","flutter-example-app","flutter-movie","flutter-movie-app","flutter-ui","flutterbloc","real-world-project"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KhoaSuperman.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-02-01T15:41:52.000Z","updated_at":"2025-04-06T15:59:24.000Z","dependencies_parsed_at":"2022-07-12T21:40:34.965Z","dependency_job_id":null,"html_url":"https://github.com/KhoaSuperman/findseat","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KhoaSuperman%2Ffindseat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KhoaSuperman%2Ffindseat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KhoaSuperman%2Ffindseat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KhoaSuperman%2Ffindseat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KhoaSuperman","download_url":"https://codeload.github.com/KhoaSuperman/findseat/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251824220,"owners_count":21649832,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clean-architecture","flutter","flutter-app","flutter-apps","flutter-demo","flutter-example-app","flutter-movie","flutter-movie-app","flutter-ui","flutterbloc","real-world-project"],"created_at":"2024-08-02T14:00:50.580Z","updated_at":"2025-05-01T04:31:05.874Z","avatar_url":"https://github.com/KhoaSuperman.png","language":"Dart","funding_links":["https://www.paypal.me/khoahoang1012/1"],"categories":["Dart"],"sub_categories":[],"readme":"# A Completed Functional Flutter App - FindSeat (BLoC + Json API + Unit Test + Firebase Auth)\n\n![Banner](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/YoutubeBanner_v2_medium.png)\n\n## I. Introduction\nI’m Android Developer and I’m working in a software company in Vietnam. I have experience in both kind project: outsourcing project and product project. I decided to study Flutter, because I believe it’s promised in future. As experienced developer, I care about clean architecture, testing, performance and maintainability that why I keep searching for an example of completed application. Unfortunately, community now full of project such as speedcode, UI challenges, … it’s just small pieces of real world application. In fact, most of the project doesn’t have fancy UI like that.\nThat why I build this project by myself and now share it to the community, I hope you can get something from it then apply to your work.\n\nThe first version of project (v1.0) is just about UI + simple logic. In this version v2.0, I applied BloC pattern by using Flutter Bloc to project and also have unit tests for it. I also built simple Mock API for the app, it just static json file uploaded to a my private hosting. I hope I have time to do cache local data by SQLite but I have not, so hope next version will be soon available.\n\n[Check Video Demo](https://youtu.be/cxUiyI4h2Ug)\n\n## II. Showcase\n#### 2.1. Home\nIn Home screen, it just simply load then show data to UI. What you can try\n###### 2.1.1. Screen: Home 1\n![Home_1](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/Home_1.png)\n- (0) is about me :D\n- (1) is carousel slider for displaying banners, it’s automatically animate each 1 second. You can swipe left or right to see next/previous item\n- (2) is list seat categories. If you click on a category, app will open All shows screen. It’s horizontal list so you can swipe to reach more item\n- (3) is recommended seats. Click on item app will open Show details screen\n###### 2.1.2. Screen: Home 2\n![Home_2](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/Home_2.png)\n- (4) is nearby theatres. There’s nothing special to try here, it’s just simple map with highlighted cine’s locations\n- (5) (6) is list shows by each category. Same with recommended seats, you can click on item to open Show details screen\n#### 2.2. All Shows\n###### 2.2.1. Screen: All Shows 1\n![AllShows_1](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/AllShows_1.png)\n- (1) click to open search field. Basically support search by name\n- (2) click to open sort option. Basically support sort by rating and name\n- (3) there’re 3 tabs: Now showing, Coming soon and Exclusive. You can swipe left/right to view content of each tab\n- (4) Display list show in gridview\n###### 2.2.2. Screen: All Shows 2\n![AllShows_2](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/AllShows_2.png)\n- Sort options dialog\n###### 2.2.3. Screen: All Shows 3\n![AllShows_3](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/AllShows_3.png)\n- App will perform search after stop typing for 400 milliseconds, technically it’s debounce technique.\nTry to click on item, app will open Show details screen\n#### 2.3. Show info\n###### 2.3.1. Screen: Show Info 1\n![ShowInfo_1](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/ShowInfo_1.png)\n- (1) is trailer of show from Youtube link\n- (2) show’s description\n- (3) is offer section. This is not static content, it can be changed in mock API\n###### 2.3.2. Screen: Show Info 2\n![ShowInfo_2](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/ShowInfo_2.png)\n- (4) is user’s review section. Basically write review function is not available yet\n- (5) is casts section. It’s horizontal listview, you can swipe to reach more content.\n- (6) Click Book seats then app will open Book Time Slot screen\n#### 2.4. Book Time Slot\n###### 2.4.1. Screen: Book Time Slot 1\n![BookTimeSlot_1](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/BookTimeSlot_1.png)\n- (1) Click to open search field. Basically support search by Cine’s name\n- (2) List cine with time slots. Gray item is time slot that is not available.\n###### 2.4.2. Screen: Book Time Slot 2\n![BookTimeSlot_2](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/BookTimeSlot_2.png)\n- App will perform search after stop typing for 400 milliseconds, technically it’s debounce technique.\nClick on item time slot, app will open Book Seat Type screen.\n#### 2.5. Book Seat Type\n![BookSeatType](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/BookSeatType_1.png)\n- (1) choose number of seats\n- (2) choose seat type\n#### 2.6. Book Seat Slot\n![BookSeatSlot](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/BookSeatSlot_1.png)\n- (1) is count of number booked seats\n- (2) Booked seats. You can click to select then click again to deselect seat.\n- Validate: For example in screen Book Seat Type you chosen 3 seats, type is Jack that mean\n  - You cannot select Queen or King seat\n  - You cannot book more than 3 seats\n#### 2.7. Make payment\n###### 2.7.1. Screen: Make payment 1\n![MakePayment_1](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/MakePayment_1.png)\n- App integrated with Stripe SDK, currently for testing when you click on any method Debit/UDI/Net banking, app only show option pay by input card to the form.\n\n###### 2.7.2. Screen: Make payment 2\n![MakePayment_2](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/MakePayment_2.png)\n- For testing, please use following information:\n  - Card number: 4242 4242 4242 4242\n  - Expiration date: 04/24\n  - CVC: 424 or 242\n###### 2.7.3. Screen: Make payment 3\n![MakePayment_3](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/MakePayment_3.png)\n- After Stripe verified the payment information, app will show your booking information.\n#### 2.8. Login\n![Login](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/Login_1.png)\n- Basically app provide login by user’s email and password. Login by Google and Facebook will be available soon.\n- Test account: khoaha+dev2@mailinator.com / 123456\n#### 2.9. Register\n![Register](https://raw.githubusercontent.com/KhoaSuperman/findseat/apply_bloc/sample_data/github_screenshots/Register_1.png)\n- I did validation in this form using Bloc pattern, you can look at this to study how to do form validation in Bloc.\n\n## III. Mock API\nhttps://integer.sgp1.digitaloceanspaces.com/findseat\n\nAPI | Usage\n------------ | -------------\n/home.json | Return data for Home screen\n/all_shows_by_type.json | Return data for All Shows screen\n/booking_time_slot_by_cine.json | Return data for Book Time Slot screen\n/book_seat_slot_by_time_slot.json | Return data for Book Seat Slot screen\n\n## IV. Plugins\nPlugin | Usage\n------------ | -------------\n[retrofit](https://pub.dev/packages/retrofit#-readme-tab-) | For working with restful API, generated model\n[json_annotation](https://pub.dev/packages/json_annotation#-readme-tab-) | Same as above (SAA)\n[dio](https://pub.dev/packages/dio) | SAA\n[build_runner](http://build_runner) | SAA\n[flutter_bloc](https://pub.dev/packages/flutter_bloc) | For build app architecture\n[carousel_slider](https://pub.dev/packages/carousel_slider#-readme-tab-) | Use for section banner in Home screen\n[freezed](https://pub.dev/packages/freezed) | Working with State of bloc\n[equatable](https://pub.dev/packages/equatable) | SAA\n[meta](https://pub.dev/packages/meta) | SAA\n[intl](https://pub.dev/packages/intl) | Format date time and other formats\n[youtube_player_flutter](https://pub.dev/packages/youtube_player_flutter) | Display trailer from Youtube link\n[shared_preferences](https://pub.dev/packages/shared_preferences) | For caching user’s session\n[flutter_svg](https://pub.dev/packages/shared_preferences) | Display svg icon\n[google_maps_flutter](https://pub.dev/packages/google_maps_flutter) | Display address of cine\n[dotted_border](https://pub.dev/packages/dotted_border) | Display dot border of offer ticket in Show details screen\n[shimmer](https://pub.dev/packages/shimmer) | Animate image place holder\n[stripe_payment](https://pub.dev/packages/stripe_payment) | Use in booking feature\n[firebase_core](https://pub.dev/packages/firebase_core) | For register account and login using Firebase\n[google_sign_in](https://pub.dev/packages/google_sign_in) | SAA\n[firebase_auth](https://pub.dev/packages/firebase_auth) | SAA\n[test](https://pub.dev/packages/test) | Try to use unit testing, most of the cases come from Bloc\n[bloc_test](https://pub.dev/packages/bloc_test) | SAA\n\n## V. Design credit\n##### Author: [Dinu Dinesh](https://www.uplabs.com/getdineshonline)\n##### Design link: [Movie \u0026 events ticket booking app](https://www.uplabs.com/posts/movie-events-ticket-booking-app)\n\n## Development Environment\n`flutter doctor -v`\n```\n[√] Flutter (Channel stable, 2.8.1, on Microsoft Windows [Version 10.0.19043.1586], locale en-US)\n    • Flutter version 2.8.1 at C:\\src\\flutter\n    • Upstream repository https://github.com/flutter/flutter.git\n    • Framework revision 77d935af4d (3 months ago), 2021-12-16 08:37:33 -0800\n    • Engine revision 890a5fca2e\n    • Dart version 2.15.1\n\n[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)\n    • Android SDK at C:\\Users\\ASUS\\AppData\\Local\\Android\\sdk\n    X cmdline-tools component is missing\n      Run `path/to/sdkmanager --install \"cmdline-tools;latest\"`\n      See https://developer.android.com/studio/command-line for more details.\n    X Android license status unknown.\n      Run `flutter doctor --android-licenses` to accept the SDK licenses.\n      See https://flutter.dev/docs/get-started/install/windows#android-setup for more details.\n\n[√] Chrome - develop for the web\n    • Chrome at C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\n\n[√] Android Studio (version 3.1)\n    • Android Studio at C:\\Program Files\\Android\\Android Studio\n    • Flutter plugin version 29.0.1\n    • Dart plugin version 173.4700\n    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1024-b02)\n\n[√] Android Studio (version 3.5)\n    • Android Studio at C:\\Program Files\\Android\\android-studio\n    • Flutter plugin version 42.1.1\n    • Dart plugin version 191.8593\n    • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b03)\n\n[√] Android Studio (version 3.6)\n    • Android Studio at C:\\Program Files\\Android\\AS33\n    • Flutter plugin version 49.0.1\n    • Dart plugin version 192.8052\n    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b04)\n\n[√] IntelliJ IDEA Community Edition (version 2020.3)\n    • IntelliJ at C:\\Program Files\\JetBrains\\IntelliJ IDEA Community Edition 2020.3.1\n    • Flutter plugin can be installed from:\n       https://plugins.jetbrains.com/plugin/9212-flutter\n    • Dart plugin can be installed from:\n       https://plugins.jetbrains.com/plugin/6351-dart\n\n[√] IntelliJ IDEA Ultimate Edition (version 2021.1)\n    • IntelliJ at C:\\Program Files\\JetBrains\\IntelliJ IDEA 2021.1\n    • Flutter plugin can be installed from:\n       https://plugins.jetbrains.com/plugin/9212-flutter\n    • Dart plugin can be installed from:\n       https://plugins.jetbrains.com/plugin/6351-dart\n\n[√] VS Code (version 1.65.0)\n    • VS Code at C:\\Users\\ASUS\\AppData\\Local\\Programs\\Microsoft VS Code\n    • Flutter extension can be installed from:\n       https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter\n\n[√] Connected device (3 available)\n    • sdk gphone x86 (mobile) • emulator-5554 • android-x86    • Android 11 (API 30) (emulator)\n    • Chrome (web)            • chrome        • web-javascript • Google Chrome 99.0.4844.74\n    • Edge (web)              • edge          • web-javascript • Microsoft Edge 98.0.1108.62\n\n! Doctor found issues in 1 category.\n\n```\n\nBefore run project, execute commands:\n- `flutter clean`\n- `flutter pub get`\n- `flutter pub run build_runner build` or `flutter pub run build_runner build --delete-conflicting-outputs`\n- `flutter run` (if needed)\n\n## Support\n- If you wanna get updates in next version, please give me a ⭐ to the repo 👍\n- If you love my work and want to support, [buy me a coffee here](https://www.paypal.me/khoahoang1012/1). Thank you so much 👍\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKhoaSuperman%2Ffindseat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FKhoaSuperman%2Ffindseat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKhoaSuperman%2Ffindseat/lists"}