{"id":22253309,"url":"https://github.com/willacosta/flutter_nasa_apod_app","last_synced_at":"2026-04-29T11:01:34.332Z","repository":{"id":228469157,"uuid":"771780392","full_name":"WillACosta/flutter_nasa_apod_app","owner":"WillACosta","description":"This application, provides a showcase of using NASA's APOD (Astronomic Picture of The Day) API for for show awesome pictures of the universe, made with Dart/Flutter 💙","archived":false,"fork":false,"pushed_at":"2024-04-01T16:28:14.000Z","size":4173,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-30T11:24:54.344Z","etag":null,"topics":["apod-api","clean-architecture","flutter","melos-cli","nasa","nasa-api","nasa-apod"],"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/WillACosta.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,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-03-13T23:54:04.000Z","updated_at":"2024-04-30T21:39:58.000Z","dependencies_parsed_at":"2024-03-19T00:25:42.813Z","dependency_job_id":"65698f9d-4e5d-4d95-8b80-cbf5f493d67c","html_url":"https://github.com/WillACosta/flutter_nasa_apod_app","commit_stats":null,"previous_names":["willacosta/cloudwalk-mobile-test","willacosta/flutter_nasa_apod_app"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WillACosta%2Fflutter_nasa_apod_app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WillACosta%2Fflutter_nasa_apod_app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WillACosta%2Fflutter_nasa_apod_app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WillACosta%2Fflutter_nasa_apod_app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WillACosta","download_url":"https://codeload.github.com/WillACosta/flutter_nasa_apod_app/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245459977,"owners_count":20618965,"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":["apod-api","clean-architecture","flutter","melos-cli","nasa","nasa-api","nasa-apod"],"created_at":"2024-12-03T07:17:47.851Z","updated_at":"2026-04-29T11:01:29.277Z","avatar_url":"https://github.com/WillACosta.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"### @flutter_nasa_apod_app\n\nThis application provides a showcase of using NASA's APOD (Astronomic Picture of The Day) API to show awesome pictures of the universe, made with Dart/Flutter 💙. Here you'll find concepts such as Clean Architecture, Clean Code, SOLID, and other things related to the best coding practices.\n\n#\n\n- **[Features and Architecture](#features-and-architecture)**\n- **[Technical Resources](#technical-resources)**\n- **[Getting Started](#getting-started)**\n\n\u003cbr\u003e\n\n![Screenshot showing app pages](docs/images/screenshots.png \"Screenshot showing app pages\")\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n## Features and Architecture\n\nThe project has only one main feature called: `:feature_media`, which holds the business rule for retrieving media items from NASA's Open API and handling the results accordingly. You can find out more details in the next section.\n\n![An image of app feature flow](docs/images/apod_flow.png \"An image of app feature flow\")\n\n## App Modularization Guide\n\nThis project uses a modularization approach with mono-repo, to organize\nand breaking the concept of monolithic into loosely coupled, self-contained\nmodules.\n\n![A module graph of project](docs/images/apod_modules.png \"A module graph of project\")\n\nHere we have the following types of modules:\n\n- The `app` module - is the main entry point for the app and contains some app-level\n  configuration.\n\n- `feature` modules - contains specific modules which have a single responsibility\n  and it follows Clean Architecture's approach.\n\n- `core` modules - common library modules and specific dependencies that need to be\n  shared between other modules in the app. These modules can be dependent on another core modules, but they shouldn’t depend on feature or app modules.\n\nAll these modules are managed by Melos CLI, with this tool, we have more control\nover the dependencies in the entire project and we able to execute common tasks in all modules\nat the same time -- [know more about Melos here](https://melos.invertase.dev/).\nYou can find, some scripts that are used by the project on `melos.yaml` file in the\nroot directory.\n\nAs mentioned above, the project uses a mono-repo approach to organize all\nthe modules, this means that all the necessary modules exist inside this repository.\nAs you can see below:\n\n```\n.\n├── apps\n│   └── apod\n│\n├── packages\n│  ├── core\n│  ├── feature\n│  └── ui\n│\n└── melos.yaml\n```\n\n\u003cbr\u003e\n\n# Technical Resources\n\n- Usage of a simple state management with `Value Notifier`\n- Clean architecture, SOLID, and mono-repo concepts\n- Usage of package `Result` for handling errors and success cases\n- Lazy Loading for Infinity Scroll\n- Offline storage with Shared Preferences (caching)\n- Usage of Google Fonts (Poppins) for custom UIs\n- CI workflow with GitHub Actions\n- Melos CLI for management of mono-repo packages\n\n\u003cbr\u003e\n\n# Getting Started\n\n1. First you need to set up Flutter SDK. The project uses `FVM CLI` to manage flutter versions.\n\n- Install FVM globally (macOS)\n\n```shell\nbrew tap leoafarias/fvm\nbrew install fvm\n```\n\n- Install the compatible version for this project, which you can find in this directory `.fvm/fvm_config.json`\n\n```shell\nfvm install 3.19.3\n```\n\n- Set the installed version as global\n\n```shell\nfvm global 3.19.3\n```\n\n- Add the Flutter SDK path in your terminal config file `.zshrc` or `.bashrc`\n\n```shell\nexport PATH=$PATH:~/fvm/default/bin\n```\n\n2. Clone this repository\n\n```shell\ngit clone https://github.com/WillACosta/cloudwalk-mobile-test\n```\n\n3. Install `Melos CLI` as a global package with:\n\n```shell\ndart pub global activate melos\n```\n\n4. Use the following command to setup the application\n\n```shell\nmelos bootstrap\n```\n\n5. Go to the directory `apps/apod` and run the following command, to get a copy for `.env` file, and fill it with your credentials.\n\n```shell\ncd apps/apod\ncp .env.example .env\n## open the file and add your API KEY (Get on https://api.nasa.gov/)\n```\n\n6. Now, you have to install Android and iOS SDK\n\n- [iOS SDK/Xcode](https://developer.apple.com/xcode/)\n- [Android SDK/Android Studio](https://developer.android.com/studio/install)\n\n7. Open any available emulators and run the application with\n\n```shell\nflutter run\n```\n\n## Running unit tests\n\n1. Run all tests\n\n```shell\nmelos test\n```\n\nYou can find more scripts to execute in `melos.yaml` file.\n\n## Usage of JSON Server\n\nIn the case of NASA's Open API is not available, you can use the [Json Server](https://github.com/typicode/json-server) for testing purposes.\n\n- First of all, you need to setup the NodeJS environment -- see here: https://nodejs.org/en/download\n\n- After that, navigate to the json-api directory: `/api` and run:\n\n```shell\nnpx json-server database.json\n```\n\n- Then you will need to change the APOD_BASE_URL from `.env` file,\n  for using the local server address, for example:\n\n```\nhttp://localhost:3000\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillacosta%2Fflutter_nasa_apod_app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwillacosta%2Fflutter_nasa_apod_app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillacosta%2Fflutter_nasa_apod_app/lists"}