{"id":13683902,"url":"https://github.com/elias8/last_fm","last_synced_at":"2025-09-12T07:32:44.710Z","repository":{"id":41386608,"uuid":"424451898","full_name":"elias8/last_fm","owner":"elias8","description":"A simple app to demonstrate a testable, maintainable, and scalable architecture for flutter. flutter_bloc, get_it, hive, and REST API are some of the tech stacks used in this project.","archived":false,"fork":false,"pushed_at":"2022-12-25T21:36:01.000Z","size":4178,"stargazers_count":151,"open_issues_count":0,"forks_count":25,"subscribers_count":5,"default_branch":"dev","last_synced_at":"2024-11-12T05:36:38.399Z","etag":null,"topics":["bloc","clean-architecture","dart","dependency-injection","flutter","hive","lastfm","layered-architecture","music","rest-api","test"],"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/elias8.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":"2021-11-04T02:48:46.000Z","updated_at":"2024-08-15T16:15:00.000Z","dependencies_parsed_at":"2023-01-30T22:46:32.255Z","dependency_job_id":null,"html_url":"https://github.com/elias8/last_fm","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/elias8%2Flast_fm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elias8%2Flast_fm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elias8%2Flast_fm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elias8%2Flast_fm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elias8","download_url":"https://codeload.github.com/elias8/last_fm/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238306463,"owners_count":19450146,"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":["bloc","clean-architecture","dart","dependency-injection","flutter","hive","lastfm","layered-architecture","music","rest-api","test"],"created_at":"2024-08-02T14:00:20.163Z","updated_at":"2025-02-11T13:58:45.028Z","avatar_url":"https://github.com/elias8.png","language":"Dart","funding_links":[],"categories":["Dart"],"sub_categories":[],"readme":"# last_fm\n\n[![example workflow](https://github.com/elias8/last_fm/actions/workflows/workflow.yml/badge.svg)](https://github.com/Elias8/last_fm/actions/workflows/workflow.yml)\n[![codecov][coverage_link]](https://codecov.io/gh/Elias8/last_fm)\n[![Flutter version](https://img.shields.io/badge/flutter-v2.5.3-blue?logo=flutter)](https://flutter.dev/docs/development/tools/sdk/releases)\n[![License: MIT](https://img.shields.io/badge/license-MIT-purple.svg)](https://opensource.org/licenses/MIT)\n\nA simple app to demonstrate a testable, maintainable, and scalable architecture for flutter. flutter_bloc, hive, and\nREST API are some of the tech stacks used in this project.\n\n---\n\n## ScreenShots 📷\n\n![albums](screenshot/albums.png)             |  ![artist](screenshot/artist_search.png)\n---------------------------------------------|--------------------------------------------------\n![top_albums](screenshot/top_albums.png)     |  ![album_detail](screenshot/album_detail.png)\n\n## Getting Started 🚀\n\nFor the app to work, you need to provide your own [last.fm][lastfm_link] API key by issuing [here][lastfm_auth_link].\n\nOnce you get your API key, you can run or build the app by using the following command:\n\n```shell\n# Run\n$ flutter run --dart-define=API_KEY=PUT_YOUR_API_KEY_HERE\n\n# Build\n$ flutter build --dart-define=API_KEY=PUT_YOUR_API_KEY_HERE\n```\n\n---\n\n## Running Tests 🧪\n\nTo run all unit and widget tests use the following command:\n\n```shell\n$ flutter test --coverage --test-randomize-ordering-seed random\n```\n\nTo remove generated files from the coverage report, use the following command:\n\n```shell\n# install remove_from_coverage package \n$ pub global activate remove_from_coverage\n\n# remove `.g.dart` and `.config.dart` files from the coverage report\n$ pub global run remove_from_coverage:remove_from_coverage -f coverage/lcov.info -r '.g.dart', '.config.dart'\n```\n\nTo view the generated coverage report you can use [lcov][lcov_link].\n\n```shell\n# Generate Coverage Report\n$ genhtml coverage/lcov.info -o coverage/\n\n# Open Coverage Report\n$ open coverage/index.html\n```\n\n---\n\n## Working with Translations 🌐\n\nThis project relies on [flutter_localizations][flutter_localizations_link] and follows\nthe [official internationalization guide for Flutter][internationalization_link].\n\n### Adding Strings\n\n1. To add a new localized string, open the `app_en.arb` file at `lib/config/l10n/arb/app_en.arb`.\n\n```arb\n{\n  \"@@locale\": \"en\",\n  \"appName\": \"LastFM\",\n  \"@appName\": {\n    \"description\": \"The application name\"\n  }\n}\n```\n\n2. Then add a new key/value and description\n\n```arb\n{\n  \"@@locale\": \"en\",\n  \"appName\": \"LastFM\",\n  \"@appName\": {\n    \"description\": \"The application name\"\n  },\n  \"albums\": \"Albums\",\n  \"@albums\": {\n    \"description\": \"Text shown in the AppBar of AlbumsScreen\"\n  },\n}\n```\n\n3. Use the new string\n\n```dart\nimport 'package:some_app/l10n/l10n.dart';\n\n@override\nWidget build(BuildContext context) {\n  final l10n = context.l10n;\n  return Text(l10n.albums);\n}\n```\n\n### Adding Supported Locales\n\nUpdate the `CFBundleLocalizations` array in the `Info.plist` at `ios/Runner/Info.plist` to include the new locale.\n\n```xml\n    ...\n\n\u003ckey\u003eCFBundleLocalizations\u003c/key\u003e\n\u003carray\u003e\n\u003cstring\u003een\u003c/string\u003e\n\u003cstring\u003eam\u003c/string\u003e\n\u003c/array\u003e\n\n        ...\n```\n\n### Adding Translations\n\n1. For each supported locale, add a new ARB file in `lib/config/l10n/arb`.\n\n```\n├── l10n\n│   ├── arb\n│   │   ├── app_en.arb\n│   │   └── app_am.arb\n```\n\n2. Add the translated strings to each `.arb` file:\n\n`app_en.arb`\n\n```arb\n{\n  \"@@locale\": \"en\",\n  \"appName\": \"LastFM\",\n  \"@appName\": {\n    \"description\": \"The application name\"\n  },\n}\n```\n\n`app_am.arb`\n\n```arb\n{\n  \"@@locale\": \"am\",\n  \"appName\": \"የመጨረሻ ኤፍ ኤም\",\n  \"@appName\": {\n    \"description\": \"የመተግበሪያ ስም\"\n  },\n}\n```\n\n## Credit 🙏\n\nThanks to all the people who created and are maintaining these awesome packages used in this project.\n\nMaintainers                                      | Packages\n-------------------------------------------------|-------------------------------------------\n[Felix Angelov](https://github.com/felangel)     | [bloc \u0026 flutter_bloc][bloc_link], [equatable][equatable_link], [mocktail][mocktail_link]\n[Thomas Burkhart](https://github.com/escamoteur) | [get_it][get_it_link]\n[Milad akarie](https://github.com/Milad-Akarie)  | [injectable][injectable_link]\n[Chris Sells](https://github.com/csells)         | [go_router][go_router_link]\n[Very Good Ventures][vgv_link]                   | For their awesome README [template][very_good_cli_link]\nAnd everyone else                                | [dio][dio_link], [hive][hive_link], and many more...\n\n## Features and bugs\n\nYou can file features requests (not intending to add new features, but I will try to add based on requests), bugs or any\nquestions at the [issue tracker][issue_tracker_link]. \n\nAnd don't forget to give a star if you find this repo helpful, or\nyou have learned something from it!\n\n### Maintainers\n\n* [Elias Andualem](https://github.com/elias8)\n\n[flutter_localizations_link]: https://api.flutter.dev/flutter/flutter_localizations/flutter_localizations-library.html\n\n[internationalization_link]: https://flutter.dev/docs/development/accessibility-and-localization/internationalization\n\n[coverage_link]: https://codecov.io/gh/Elias8/last_fm/branch/main/graph/badge.svg?token=H09CZDS7P0\n\n[lastfm_link]: https://www.last.fm\n\n[lastfm_auth_link]: https://www.last.fm/api/authentication\n\n[lcov_link]: https://github.com/linux-test-project/lcov\n\n[issue_tracker_link]: https://github.com/Elias8/last_fm/issues\n\n[comment]: \u003c\u003e (Packages)\n\n[vgv_link]: https://github.com/VeryGoodOpenSource\n\n[bloc_link]: https://github.com/felangel/bloc\n\n[equatable_link]: https://github.com/felangel/equatable\n\n[mocktail_link]: https://github.com/felangel/mocktail\n\n[get_it_link]: https://github.com/fluttercommunity/get_it\n\n[injectable_link]: https://github.com/Milad-Akarie/injectable\n\n[go_router_link]: https://github.com/csells/go_router\n\n[very_good_cli_link]: https://github.com/verygoodopensource/very_good_cli\n\n[dio_link]: https://github.com/flutterchina/dio\n\n[hive_link]: https://github.com/hivedb/hive\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felias8%2Flast_fm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felias8%2Flast_fm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felias8%2Flast_fm/lists"}