{"id":32936787,"url":"https://github.com/hassan6197/flutter-boiler-plate","last_synced_at":"2025-11-12T02:01:11.057Z","repository":{"id":322784877,"uuid":"1090111679","full_name":"Hassan6197/flutter-boiler-plate","owner":"Hassan6197","description":"     🚀 Production-ready Flutter boilerplate with BLoC pattern, clean architecture, and interactive setup script","archived":false,"fork":false,"pushed_at":"2025-11-06T09:03:25.000Z","size":1978,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-06T11:10:36.748Z","etag":null,"topics":["bloc-pattern","clean-architecture","dart","flutter","flutter-bloc","flutter-boilerplate","flutter-template","state-management"],"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/Hassan6197.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","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,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-05T08:34:19.000Z","updated_at":"2025-11-06T09:18:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Hassan6197/flutter-boiler-plate","commit_stats":null,"previous_names":["hassan6197/flutter-boiler-plate"],"tags_count":null,"template":true,"template_full_name":null,"purl":"pkg:github/Hassan6197/flutter-boiler-plate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hassan6197%2Fflutter-boiler-plate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hassan6197%2Fflutter-boiler-plate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hassan6197%2Fflutter-boiler-plate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hassan6197%2Fflutter-boiler-plate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Hassan6197","download_url":"https://codeload.github.com/Hassan6197/flutter-boiler-plate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hassan6197%2Fflutter-boiler-plate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":283961755,"owners_count":26923662,"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","status":"online","status_checked_at":"2025-11-12T02:00:06.336Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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-pattern","clean-architecture","dart","flutter","flutter-bloc","flutter-boilerplate","flutter-template","state-management"],"created_at":"2025-11-12T02:00:30.217Z","updated_at":"2025-11-12T02:01:11.047Z","avatar_url":"https://github.com/Hassan6197.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Flutter BLoC Boilerplate\n\n[![GitHub stars](https://img.shields.io/github/stars/Hassan6197/flutter-boiler-plate?style=social)](https://github.com/Hassan6197/flutter-boiler-plate/stargazers)\n[![GitHub forks](https://img.shields.io/github/forks/Hassan6197/flutter-boiler-plate?style=social)](https://github.com/Hassan6197/flutter-boiler-plate/network/members)\n[![GitHub issues](https://img.shields.io/github/issues/Hassan6197/flutter-boiler-plate)](https://github.com/Hassan6197/flutter-boiler-plate/issues)\n[![GitHub license](https://img.shields.io/github/license/Hassan6197/flutter-boiler-plate)](https://github.com/Hassan6197/flutter-boiler-plate/blob/main/LICENSE)\n[![Flutter Version](https://img.shields.io/badge/Flutter-3.0%2B-blue.svg)](https://flutter.dev/)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/Hassan6197/flutter-boiler-plate/pulls)\n\nA production-ready Flutter boilerplate featuring clean architecture with BLoC pattern for state management. This boilerplate includes essential features like navigation, theming, localization, and network handling, making it perfect for kickstarting your next Flutter project.\n\n\u003e 💡 **Use this template**: Click the \"Use this template\" button at the top of this repository to create your own project based on this boilerplate!\n\n## ✨ Features\n\n- 🏗️ **Clean Architecture** - Organized project structure with clear separation of concerns\n- 🔄 **BLoC Pattern** - Robust state management using flutter_bloc\n- 💉 **Dependency Injection** - Manual DI pattern without external packages\n- 🎨 **Theming System** - Built-in theme management with dark mode support\n- 🌍 **Localization** - Multi-language support ready\n- 🚀 **Navigation** - Pre-configured routing system\n- 📱 **Responsive Design** - Adaptive UI with SizeUtils\n- 🔌 **Network Layer** - API client with dummy login implementation\n- 📦 **Example Screens** - Complete login with API integration, Dashboard\n- ⚙️ **Easy Setup** - Interactive CLI tool for instant project configuration\n\n## 📋 Table of Contents\n\n- [Quick Start](#-quick-start)\n- [Project Structure](#-project-structure)\n- [Architecture](#-architecture)\n- [Dependency Injection](#-dependency-injection)\n- [How to Add a New Screen](#-how-to-add-a-new-screen)\n- [State Management](#-state-management)\n- [API Integration](#-api-integration)\n- [Theming](#-theming)\n- [Localization](#-localization)\n- [Contributing](#-contributing)\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n- Flutter SDK: `\u003e=2.12.0 \u003c3.0.0`\n- Dart SDK: `\u003e=2.12.0 \u003c3.0.0`\n\n### Installation\n\n#### Option 1: Use as GitHub Template (Recommended)\n\n1. Click the **\"Use this template\"** button at the top of the [repository page](https://github.com/Hassan6197/flutter-boiler-plate)\n2. Create a new repository from the template\n3. Clone your new repository:\n   ```bash\n   git clone https://github.com/YOUR_USERNAME/YOUR_REPO_NAME.git\n   cd YOUR_REPO_NAME\n   ```\n\n#### Option 2: Clone Directly\n\n1. **Clone this repository**\n   ```bash\n   git clone https://github.com/Hassan6197/flutter-boiler-plate.git\n   cd flutter-boiler-plate\n   ```\n\n2. **Run the setup script** (Most Important Step!)\n   ```bash\n   dart run tool/setup.dart\n   ```\n   \n   This interactive script will prompt you for:\n   - App Display Name (e.g., \"My Awesome App\")\n   - Package Name (e.g., \"com.company.myapp\")\n   - Project Name (e.g., \"my_awesome_app\")\n\n   It will automatically update all necessary files including:\n   - `pubspec.yaml`\n   - All Dart import statements\n   - Android configuration (build.gradle, AndroidManifest.xml, MainActivity.kt)\n   - iOS configuration (Info.plist, project.pbxproj)\n\n   **Dry Run Mode**: Preview changes without applying them\n   ```bash\n   dart run tool/setup.dart --dry-run\n   ```\n\n3. **Install dependencies**\n   ```bash\n   flutter pub get\n   ```\n\n4. **Run the app**\n   ```bash\n   flutter run\n   ```\n\n## 📁 Project Structure\n\n```\nlib/\n├── core/                      # Core utilities and constants\n│   ├── constants/            # App constants\n│   ├── errors/               # Error handling\n│   ├── network/              # Network info and connectivity\n│   └── utils/                # Utility functions and helpers\n│       ├── image_constant.dart\n│       ├── logger.dart\n│       ├── navigator_service.dart\n│       ├── pref_utils.dart   # SharedPreferences wrapper\n│       └── size_utils.dart   # Responsive design utilities\n│\n├── data/                      # Data layer\n│   ├── apiClient/            # API client setup\n│   └── models/               # Data models\n│\n├── localization/             # Localization files\n│   └── app_localization.dart\n│\n├── presentation/             # UI layer\n│   ├── splash_screen/\n│   │   ├── bloc/            # BLoC for splash screen\n│   │   │   ├── splash_bloc.dart\n│   │   │   ├── splash_event.dart\n│   │   │   └── splash_state.dart\n│   │   ├── models/          # Screen-specific models\n│   │   └── splash_screen.dart\n│   │\n│   ├── login_screen/        # Example: Authentication screen\n│   └── dashboard_page/      # Example: List screen with navigation\n│\n├── routes/                   # Navigation\n│   └── app_routes.dart      # Route definitions\n│\n├── theme/                    # Theming\n│   ├── app_decoration.dart  # Decoration styles\n│   ├── custom_text_style.dart\n│   ├── custom_button_style.dart\n│   ├── theme_helper.dart\n│   └── bloc/                # Theme management BLoC\n│\n├── widgets/                  # Reusable widgets\n│   ├── custom_elevated_button.dart\n│   ├── custom_text_form_field.dart\n│   ├── custom_image_view.dart\n│   └── app_bar/             # Custom app bar components\n│\n└── main.dart                 # App entry point\n```\n\n## 🏗️ Architecture\n\nThis boilerplate follows a **Clean Architecture** approach with clear separation between:\n\n### Layers\n\n1. **Presentation Layer** (`lib/presentation/`)\n   - Contains UI components and BLoC for state management\n   - Each screen has its own folder with `bloc/`, `models/`, and `widgets/`\n\n2. **Data Layer** (`lib/data/`)\n   - Handles data operations, API calls, and data models\n   - Contains API client and data repositories\n\n3. **Core Layer** (`lib/core/`)\n   - Contains utilities, constants, and services used across the app\n   - No dependencies on other layers\n\n### BLoC Pattern\n\nEach screen follows this structure:\n\n```\nscreen_name/\n├── bloc/\n│   ├── screen_name_bloc.dart    # Business logic\n│   ├── screen_name_event.dart   # Events (user actions)\n│   └── screen_name_state.dart   # States (UI states)\n├── models/\n│   └── screen_name_model.dart   # Screen-specific data models\n├── widgets/                      # Screen-specific widgets (optional)\n└── screen_name.dart             # UI implementation\n```\n\n## 💉 Dependency Injection\n\nThis boilerplate uses a **manual Service Locator pattern** for dependency injection without external packages.\n\n### Why DI?\n\n- ✅ **Testability**: Easy to mock dependencies in tests\n- ✅ **Flexibility**: Swap implementations without changing code\n- ✅ **Maintainability**: Clear and explicit dependencies\n\n### How It Works\n\n```dart\n// 1. Register dependencies in main.dart\nawait initializeDependencies();\n\n// 2. Retrieve dependencies using locator\nfinal loginBloc = locator\u003cLoginBloc\u003e();\n\n// 3. Dependencies are automatically injected\nclass LoginBloc {\n  final AuthRepository repository; // Injected automatically\n  \n  LoginBloc({required this.repository});\n}\n```\n\n### Registration Patterns\n\n#### Singleton (Created Once)\n```dart\nlocator.registerSingleton\u003cApiClient\u003e(\n  ApiClient(baseUrl: 'https://api.example.com'),\n);\n```\n**Use for**: API Client, NetworkInfo, Services\n\n#### Lazy Singleton (Created on First Use)\n```dart\nlocator.registerLazySingleton\u003cDatabaseService\u003e(\n  () =\u003e DatabaseService(),\n);\n```\n**Use for**: Heavy services that might not be needed immediately\n\n#### Factory (New Instance Each Time)\n```dart\nlocator.registerFactory\u003cLoginBloc\u003e(\n  () =\u003e LoginBloc(authRepository: locator\u003cAuthRepository\u003e()),\n);\n```\n**Use for**: BLoCs, ViewModels (to avoid state issues)\n\n### Complete Example\n\n#### Step 1: Register in `injection_container.dart`\n\n```dart\nclass InjectionContainer {\n  static Future\u003cvoid\u003e init() async {\n    // Register API Client\n    locator.registerSingleton\u003cApiClient\u003e(\n      ApiClient(baseUrl: 'https://api.example.com'),\n    );\n    \n    // Register Repository\n    locator.registerSingleton\u003cAuthRepository\u003e(\n      AuthRepository(apiClient: locator\u003cApiClient\u003e()),\n    );\n    \n    // Register BLoC\n    locator.registerFactory\u003cLoginBloc\u003e(\n      () =\u003e LoginBloc(authRepository: locator\u003cAuthRepository\u003e()),\n    );\n  }\n}\n```\n\n#### Step 2: Use in Screen\n\n```dart\nstatic Widget builder(BuildContext context) {\n  return BlocProvider\u003cLoginBloc\u003e(\n    create: (context) =\u003e locator\u003cLoginBloc\u003e(), // Get from DI\n    child: LoginScreen(),\n  );\n}\n```\n\n### Full Login Example with API\n\nThis boilerplate includes a complete working example:\n\n**Test Credentials**:\n- Email: `test@example.com`\n- Password: `password123`\n\nThe login flow demonstrates:\n1. Form validation\n2. API call through repository\n3. Loading states\n4. Error handling\n5. Success navigation\n\nTry it in the app to see DI and API integration in action!\n\n### Learn More\n\n- 📖 [Complete DI Guide](docs/DEPENDENCY_INJECTION.md)\n- 🔌 [API Integration Guide](docs/API_INTEGRATION.md)\n\n## 📱 How to Add a New Screen\n\nFollow these steps to add a new screen with BLoC:\n\n### 1. Create Screen Structure\n\n```bash\nlib/presentation/profile_screen/\n├── bloc/\n├── models/\n└── profile_screen.dart\n```\n\n### 2. Create Model\n\n```dart\n// models/profile_model.dart\nimport 'package:equatable/equatable.dart';\n\nclass ProfileModel extends Equatable {\n  final String name;\n  final String email;\n\n  ProfileModel({this.name = '', this.email = ''});\n\n  ProfileModel copyWith({String? name, String? email}) {\n    return ProfileModel(\n      name: name ?? this.name,\n      email: email ?? this.email,\n    );\n  }\n\n  @override\n  List\u003cObject?\u003e get props =\u003e [name, email];\n}\n```\n\n### 3. Create BLoC Events\n\n```dart\n// bloc/profile_event.dart\npart of 'profile_bloc.dart';\n\nabstract class ProfileEvent extends Equatable {\n  @override\n  List\u003cObject?\u003e get props =\u003e [];\n}\n\nclass ProfileInitialEvent extends ProfileEvent {}\n\nclass UpdateProfileEvent extends ProfileEvent {\n  final String name;\n  final String email;\n\n  UpdateProfileEvent({required this.name, required this.email});\n\n  @override\n  List\u003cObject?\u003e get props =\u003e [name, email];\n}\n```\n\n### 4. Create BLoC State\n\n```dart\n// bloc/profile_state.dart\npart of 'profile_bloc.dart';\n\nclass ProfileState extends Equatable {\n  final ProfileModel? profileModelObj;\n\n  ProfileState({this.profileModelObj});\n\n  @override\n  List\u003cObject?\u003e get props =\u003e [profileModelObj];\n\n  ProfileState copyWith({ProfileModel? profileModelObj}) {\n    return ProfileState(\n      profileModelObj: profileModelObj ?? this.profileModelObj,\n    );\n  }\n}\n```\n\n### 5. Create BLoC\n\n```dart\n// bloc/profile_bloc.dart\nimport 'package:equatable/equatable.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport '../models/profile_model.dart';\n\npart 'profile_event.dart';\npart 'profile_state.dart';\n\nclass ProfileBloc extends Bloc\u003cProfileEvent, ProfileState\u003e {\n  ProfileBloc(ProfileState initialState) : super(initialState) {\n    on\u003cProfileInitialEvent\u003e(_onInitialize);\n    on\u003cUpdateProfileEvent\u003e(_onUpdateProfile);\n  }\n\n  _onInitialize(ProfileInitialEvent event, Emitter\u003cProfileState\u003e emit) async {\n    // Initialize data\n    emit(state.copyWith(\n      profileModelObj: ProfileModel(name: 'John Doe', email: 'john@example.com')\n    ));\n  }\n\n  _onUpdateProfile(UpdateProfileEvent event, Emitter\u003cProfileState\u003e emit) async {\n    final updatedModel = state.profileModelObj?.copyWith(\n      name: event.name,\n      email: event.email,\n    );\n    emit(state.copyWith(profileModelObj: updatedModel));\n  }\n}\n```\n\n### 6. Create UI Screen\n\n```dart\n// profile_screen.dart\nimport 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'bloc/profile_bloc.dart';\nimport 'models/profile_model.dart';\n\nclass ProfileScreen extends StatelessWidget {\n  static Widget builder(BuildContext context) {\n    return BlocProvider\u003cProfileBloc\u003e(\n      create: (context) =\u003e ProfileBloc(ProfileState(profileModelObj: ProfileModel()))\n        ..add(ProfileInitialEvent()),\n      child: ProfileScreen(),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: Text('Profile')),\n      body: BlocBuilder\u003cProfileBloc, ProfileState\u003e(\n        builder: (context, state) {\n          return Column(\n            children: [\n              Text('Name: ${state.profileModelObj?.name ?? ''}'),\n              Text('Email: ${state.profileModelObj?.email ?? ''}'),\n            ],\n          );\n        },\n      ),\n    );\n  }\n}\n```\n\n### 7. Add Route\n\n```dart\n// routes/app_routes.dart\nclass AppRoutes {\n  static const String profileScreen = '/profile_screen';\n  \n  static Map\u003cString, WidgetBuilder\u003e get routes =\u003e {\n    profileScreen: ProfileScreen.builder,\n    // ... other routes\n  };\n}\n```\n\n## 🔄 State Management\n\nThis boilerplate uses **flutter_bloc** for state management. Key concepts:\n\n### Events\nEvents represent user actions or system events:\n```dart\ncontext.read\u003cProfileBloc\u003e().add(UpdateProfileEvent(name: 'John', email: 'john@example.com'));\n```\n\n### States\nStates represent the UI state at any given time. Use `BlocBuilder` to rebuild UI:\n```dart\nBlocBuilder\u003cProfileBloc, ProfileState\u003e(\n  builder: (context, state) {\n    return Text(state.profileModelObj?.name ?? '');\n  },\n)\n```\n\n### BlocSelector\nFor performance, use `BlocSelector` to rebuild only when specific state changes:\n```dart\nBlocSelector\u003cProfileBloc, ProfileState, String?\u003e(\n  selector: (state) =\u003e state.profileModelObj?.name,\n  builder: (context, name) {\n    return Text(name ?? '');\n  },\n)\n```\n\n## 🎨 Theming\n\n### Using Theme\n```dart\n// Access theme\nText('Hello', style: theme.textTheme.titleMedium);\n\n// Access custom text styles\nText('Hello', style: CustomTextStyles.labelLargeCyan300);\n\n// Access app theme colors\nContainer(color: appTheme.cyan300);\n```\n\n### Switching Themes\n```dart\ncontext.read\u003cThemeBloc\u003e().add(ChangeThemeEvent(themeType: ThemeType.dark));\n```\n\n## 🔌 API Integration\n\n### 1. Setup API Client\n\n```dart\n// data/apiClient/api_client.dart\nimport 'package:http/http.dart' as http;\nimport 'dart:convert';\n\nclass ApiClient {\n  static const String baseUrl = 'https://api.example.com';\n\n  Future\u003cMap\u003cString, dynamic\u003e\u003e get(String endpoint) async {\n    final response = await http.get(Uri.parse('$baseUrl$endpoint'));\n    \n    if (response.statusCode == 200) {\n      return json.decode(response.body);\n    } else {\n      throw Exception('Failed to load data');\n    }\n  }\n\n  Future\u003cMap\u003cString, dynamic\u003e\u003e post(String endpoint, Map\u003cString, dynamic\u003e body) async {\n    final response = await http.post(\n      Uri.parse('$baseUrl$endpoint'),\n      headers: {'Content-Type': 'application/json'},\n      body: json.encode(body),\n    );\n    \n    if (response.statusCode == 200 || response.statusCode == 201) {\n      return json.decode(response.body);\n    } else {\n      throw Exception('Failed to post data');\n    }\n  }\n}\n```\n\n### 2. Use in BLoC\n\n```dart\nclass ProfileBloc extends Bloc\u003cProfileEvent, ProfileState\u003e {\n  final ApiClient apiClient = ApiClient();\n\n  _onLoadProfile(LoadProfileEvent event, Emitter\u003cProfileState\u003e emit) async {\n    try {\n      final data = await apiClient.get('/profile');\n      emit(state.copyWith(profileModelObj: ProfileModel.fromJson(data)));\n    } catch (e) {\n      // Handle error\n      print('Error: $e');\n    }\n  }\n}\n```\n\n## 🌍 Localization\n\n### Add New Translation\n\n```dart\n// localization/app_localization.dart\nMap\u003cString, String\u003e enUs() {\n  return {\n    'lbl_welcome': 'Welcome',\n    'msg_hello_user': 'Hello, @name!',\n  };\n}\n```\n\n### Use in UI\n\n```dart\nText(\"lbl_welcome\".tr);  // Output: Welcome\nText(\"msg_hello_user\".tr.replaceAll('@name', 'John'));  // Output: Hello, John!\n```\n\n## 🛠️ Additional Configuration\n\n### Environment Variables\n\nCreate `.env` file for sensitive data:\n```\nAPI_BASE_URL=https://api.example.com\nAPI_KEY=your_api_key_here\n```\n\n### Firebase Setup (Optional)\n\n1. Add `google-services.json` for Android\n2. Add `GoogleService-Info.plist` for iOS\n3. Update dependencies in `pubspec.yaml`\n\n## 📚 Dependencies\n\nKey dependencies included:\n\n- `flutter_bloc` - State management\n- `equatable` - Value equality\n- `cached_network_image` - Image caching\n- `shared_preferences` - Local storage\n- `connectivity_plus` - Network connectivity\n- `flutter_svg` - SVG support\n- `intl` - Internationalization\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## 📄 License\n\nThis project is open source and available under the [MIT License](LICENSE).\n\n## 💡 Tips\n\n- Always run `flutter pub get` after cloning\n- Use the setup script for proper project configuration\n- Follow the BLoC pattern for consistency\n- Keep widgets small and reusable\n- Use const constructors wherever possible for better performance\n\n## 🆘 Support\n\nFor issues, questions, or contributions, please visit the [GitHub repository](https://github.com/Hassan6197/flutter-boiler-plate).\n\n- 🐛 [Report Bug](https://github.com/Hassan6197/flutter-boiler-plate/issues/new?labels=bug)\n- 💡 [Request Feature](https://github.com/Hassan6197/flutter-boiler-plate/issues/new?labels=enhancement)\n- 💬 [Start Discussion](https://github.com/Hassan6197/flutter-boiler-plate/discussions)\n\n---\n\nHappy Coding! 🚀\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhassan6197%2Fflutter-boiler-plate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhassan6197%2Fflutter-boiler-plate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhassan6197%2Fflutter-boiler-plate/lists"}