{"id":13684794,"url":"https://github.com/rrifafauzikomara/MovieApp","last_synced_at":"2025-05-01T00:33:25.000Z","repository":{"id":45375289,"uuid":"248946096","full_name":"rrifafauzikomara/MovieApp","owner":"rrifafauzikomara","description":"[Flutter SDK V.1] -  🎬 MovieApp is a Flutter application built to demonstrate the use of modern development tools with best practices implementation like Modularization, BLoC, Dependency Injection, Dynamic Theme, Cache, Shimmer, Testing, Flavor, CI/CD, etc.","archived":false,"fork":false,"pushed_at":"2021-03-05T15:06:25.000Z","size":59427,"stargazers_count":288,"open_issues_count":4,"forks_count":88,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-08-03T14:08:03.463Z","etag":null,"topics":["best-practices","bloc-pattern","cachemanager","ci-cd","dio","dynamic-theme","equatable","flavor","integration-testing","modularization","retrofit","sharedpreferences","shimmer-loading","unit-testing"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rrifafauzikomara.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-03-21T09:42:02.000Z","updated_at":"2024-07-29T03:09:52.000Z","dependencies_parsed_at":"2022-08-26T08:01:14.096Z","dependency_job_id":null,"html_url":"https://github.com/rrifafauzikomara/MovieApp","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rrifafauzikomara%2FMovieApp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rrifafauzikomara%2FMovieApp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rrifafauzikomara%2FMovieApp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rrifafauzikomara%2FMovieApp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rrifafauzikomara","download_url":"https://codeload.github.com/rrifafauzikomara/MovieApp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224230610,"owners_count":17277372,"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":["best-practices","bloc-pattern","cachemanager","ci-cd","dio","dynamic-theme","equatable","flavor","integration-testing","modularization","retrofit","sharedpreferences","shimmer-loading","unit-testing"],"created_at":"2024-08-02T14:00:38.861Z","updated_at":"2024-11-12T06:30:39.623Z","avatar_url":"https://github.com/rrifafauzikomara.png","language":"Dart","funding_links":[],"categories":["Dart"],"sub_categories":[],"readme":"# Movie App\n![GitHub stars](https://img.shields.io/github/stars/rrifafauzikomara/MovieCatalogue?style=social)\n![GitHub forks](https://img.shields.io/github/forks/rrifafauzikomara/MovieCatalogue?style=social)\n![GitHub watchers](https://img.shields.io/github/watchers/rrifafauzikomara/MovieCatalogue?style=social)\n\n[![Codemagic build status](https://api.codemagic.io/apps/5ec63ade43c9304d454e75e7/5ec64f3243c9304d454e7682/status_badge.svg)](https://codemagic.io/apps/5ec63ade43c9304d454e75e7/5ec64f3243c9304d454e7682/latest_build)\n[![GitHub license](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![platform](https://img.shields.io/badge/platform-Flutter-blue.svg)](https://flutter.dev/)\n[![Open Source Love](https://badges.frapsoft.com/os/v2/open-source.svg?v=103)](https://github.com/rrifafauzikomara/MovieCatalogue)\n\n\n[\u003cimg src=\"https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png\" alt=\"Get it on Google Play\" height=\n\"80\"\u003e](https://play.google.com/store/apps/details?id=id.rifafauzi.movie)\n\n\n## Features\n*  Switch Theme (Dark and Light) by App 🔥\n*  Movies\n*  Tv Show\n*  Discover\n*  Detail Movies \u0026 Tv Show (with Trailer and Crew)\n*  [Booking Ticket Simulation](https://github.com/triannoviandi/movie-ticketing-app) (I modified from the original code 😁)\n\n\n## 📸 Example iOS\n\u003cpre\u003e\n\u003cimg src=\"screenshot/ios1.png\" width=\"28.5%\"\u003e     \u003cimg src=\"screenshot/ios2.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/ios3.png\" width=\"28.5%\"\u003e     \u003cimg src=\"screenshot/ios4.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/ios5.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/ios6.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/ios7.png\" width=\"28.5%\"\u003e     \u003cimg src=\"screenshot/ios8.png\" width=\"28.5%\"\u003e     \u003cimg src=\"screenshot/ios9.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/ios10.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/ios11.png\" width=\"30%\"\u003e\n\u003c/pre\u003e\n\n\n## 📸 Example Android\n\u003cpre\u003e\n\u003cimg src=\"screenshot/android1.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/android2.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/android3.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/android4.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/android5.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/android6.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/android7.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/android8.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/android9.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/android10.png\" width=\"30%\"\u003e     \u003cimg src=\"screenshot/android11.png\" width=\"30%\"\u003e\n\u003c/pre\u003e\n\n\n## Quick start\nThis is a normal flutter app. You should follow the instructions in the [official documentation](https://flutter.io/docs/get-started/install).\nThis project uses **BLoC** (business logic component) to separate the business logic with UI itself.\nIt's recommended to do self-study about it before jumping into the project [here](https://bloclibrary.dev/).\nAnd also on this project uses **Modularization** approach to separate each feature ([core](https://github.com/rrifafauzikomara/MovieApp/tree/master/libraries/core), [shared](https://github.com/rrifafauzikomara/MovieApp/tree/master/libraries/shared), [ui](https://github.com/rrifafauzikomara/MovieCatalogue/tree/master/lib/ui) modules).\nYou can do self-study about it in [here](https://medium.com/flutter-community/mastering-flutter-modularization-in-several-ways-f5bced19101a).\n\n\n## Modularization Structure 🔥\n\n    # Root Project\n    .\n    |\n    ├── lib                        # Name of module (default from Flutter).\n    │   ├── launcher               # Main Application.\n    │   └── ui                     # Activity/View layer.\n    |\n    └── libraries                  # Name of directory.\n        ├── core                   # Name of module.\n        │   ├── bloc               # Business logic component.\n        │   ├── di                 # Dependency injection.\n        │   ├── local              # Local data handlers.\n        │   ├── network            # Remote data handlers.\n        │   └── repository         # Repository data handlers.\n        |\n        ├── dependencies           # Name of module (Handle dependency version updates).\n        |\n        └── shared                 # Name of module.\n            ├── common             # Common shared.\n            └── widget             # Custom widget which can be used repeatedly.\n\n\n## Built With 🛠\n* [BLoC Pattern](https://bloclibrary.dev/) - Business logic component to separate the business logic with UI.\n* [Equatable](https://pub.dev/packages/equatable) - Being able to compare objects in `Dart` often involves having to override the `==` operator.\n* [Dio](https://github.com/flutterchina/dio/) - A type-safe HTTP client.\n* [Json Serializable](https://pub.dev/packages/json_serializable) - Builders for handling JSON.\n* [Shared Preferences](https://pub.dev/packages/shared_preferences) - Cache implementation approach.\n* [Modularization](https://medium.com/flutter-community/mastering-flutter-modularization-in-several-ways-f5bced19101a) - Separate functionality into independent, interchangeable modules.\n* [Shimmer](https://pub.dev/packages/shimmer) - Loading handler.\n* [Flutter Launcher Icons](https://pub.dev/packages/flutter_launcher_icons) - Launcher icons handler.\n* [Flavor](https://medium.com/@animeshjain/build-flavors-in-flutter-android-and-ios-with-different-firebase-projects-per-flavor-27c5c5dac10b) - Handling different environments for development and production.\n* [Codemagic](https://blog.codemagic.io/environments-in-flutter-with-codemagic-cicd/) - Handling DevOps CI/CD for pipeline and automatically build.\n* Handle State - (Loading, No Data, Has Data, No Internet Connection, Request Timeout, Error)\n* [Build Release for Android](https://flutter.dev/docs/deployment/android) - Available on the [Play Store](https://play.google.com/store/apps/details?id=id.rifafauzi.movie)\n* [Youtube Player](https://pub.dev/packages/youtube_player_flutter) - Play Trailer Video.\n* [Extension Methods](https://dart.dev/guides/language/extension-methods)\n* [Pull To Refresh](https://pub.dev/packages/liquid_pull_to_refresh) - Handle Pull to Refresh the Content\n* [Get It](https://pub.dev/packages/get_it) - A Dependency Injection\n\n\n## Todo\n* [ ] Add Lint\n* [ ] Add Favorite Movie and Tv Show using Moor\n* [ ] Reminder with Notification\n* [ ] Play Trailer with Full Screen\n* [ ] Re-write Integration Testing (UI Test) because of Redesign UI\n* [ ] Unit Testing (Mockito with BLoC)\n* [ ] Add Fastlane\n* [ ] Add CI to automatically publish to Firebase App Distribution\n\n\n## How to run the App\n1. Clone this project.\n2. Open with your favorite tools editor.\n3. Run `Pub get` on each module sequentially starting from `dependencies`, `core`, `shared`, and `your root project` to generated `pubspec.lock` file.\n4. Add your `API_KEY` into ***api_constant.dart*** file.\n5. Generated `*.g.dart` file in `core` module. But before you running that, make sure go to [core](https://github.com/rrifafauzikomara/MovieApp/tree/master/libraries/core) module first using `cd` command. For example `cd libraries` and then `cd core`. Then you can run this command: `flutter packages pub run build_runner build --delete-conflicting-outputs`.\n6. Run the App using [this](https://github.com/rrifafauzikomara/MovieApp#run-the-app-using-command-prompt) or [this](https://github.com/rrifafauzikomara/MovieApp#run-the-app-using-). Enjoy your App!.\n\n\n## Run the App using command prompt\nDevelopment\n```console\nflutter run --flavor development --target=lib/launcher/main-dev.dart\n```\nProduction\n```console\nflutter run --flavor production --target=lib/launcher/main-prod.dart\n```\n\n\n## Run the App using \u003cimg src=\"https://github.com/rrifafauzikomara/MovieCatalogue/blob/master/screenshot/running.png\" alt=\"Run\" width=\"20\" height=\"20\"/\u003e\n\u003cpre\u003e\n\u003cimg src=\"https://github.com/rrifafauzikomara/MovieCatalogue/blob/master/screenshot/tutor1.png\" alt=\"Tutor1\" /\u003e\n\u003cimg src=\"https://github.com/rrifafauzikomara/MovieCatalogue/blob/master/screenshot/tutor2.png\" alt=\"Tutor2\" /\u003e\n\u003cimg src=\"https://github.com/rrifafauzikomara/MovieCatalogue/blob/master/screenshot/tutor3.png\" alt=\"Tutor3\" /\u003e\n\u003c/pre\u003e\n\n\n## How to run the Test\n### Integration Testing (will be modified, for now it's not working)\n```console\nflutter drive --target=test_driver/app.dart --flavor development\n```\n\n\n## Author\n\n* **R Rifa Fauzi Komara**\n\nDon't forget to follow me, fork and give me a ⭐\n\n\n## License\n\n```\nMIT License\n\nCopyright (c) [2020] [R Rifa Fauzi Komara]\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frrifafauzikomara%2FMovieApp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frrifafauzikomara%2FMovieApp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frrifafauzikomara%2FMovieApp/lists"}