{"id":24764214,"url":"https://github.com/utrodus/flutter-clip-link","last_synced_at":"2026-02-06T21:32:26.531Z","repository":{"id":274308776,"uuid":"866507857","full_name":"utrodus/flutter-clip-link","owner":"utrodus","description":"Flutter Clip Link is URL Shortener App built with Flutter with Material 3 Design System ","archived":false,"fork":false,"pushed_at":"2025-01-28T07:34:26.000Z","size":5222,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-01T15:12:41.811Z","etag":null,"topics":["android","bloc","dart","drift","flutter","flutter-apps","flutter-web","flutterweb","go-router","ios","progressive-web-app"],"latest_commit_sha":null,"homepage":"https://flutter-clip-link.netlify.app","language":"HTML","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/utrodus.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-10-02T11:45:25.000Z","updated_at":"2025-01-28T07:55:38.000Z","dependencies_parsed_at":"2025-06-15T12:07:56.790Z","dependency_job_id":"4c190c6b-becb-414f-90e9-eaeaeab43809","html_url":"https://github.com/utrodus/flutter-clip-link","commit_stats":null,"previous_names":["utrodus/flutter-clip-link"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/utrodus/flutter-clip-link","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/utrodus%2Fflutter-clip-link","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/utrodus%2Fflutter-clip-link/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/utrodus%2Fflutter-clip-link/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/utrodus%2Fflutter-clip-link/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/utrodus","download_url":"https://codeload.github.com/utrodus/flutter-clip-link/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/utrodus%2Fflutter-clip-link/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29177546,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-06T20:14:21.878Z","status":"ssl_error","status_checked_at":"2026-02-06T20:14:21.443Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["android","bloc","dart","drift","flutter","flutter-apps","flutter-web","flutterweb","go-router","ios","progressive-web-app"],"created_at":"2025-01-28T21:39:03.009Z","updated_at":"2026-02-06T21:32:26.518Z","avatar_url":"https://github.com/utrodus.png","language":"HTML","readme":"## Flutter Clip Link  \n\nFlutter Clip Link is a cross-platform URL shortener app that allows users to generate short links for their favorite websites, powered by **[Spoo.me](https://spoo.me/)**. The app is built using Flutter, emphasizing clean and maintainable code while delivering a seamless user experience.  \n\n### Key Features:  \n- **Bloc Pattern**: Ensures predictable state management and scalable architecture.  \n- **Responsive UI**: Adapts seamlessly across different screen sizes and platforms.  \n- **Light \u0026 Dark Mode**: Offers a visually appealing experience tailored to user preferences.  \n- **Clean Code**: Follows best practices to maintain a high-quality, readable, and maintainable codebase.  \n\nThis app is designed for efficiency and modern aesthetics, providing a robust and user-friendly solution for URL shortening.\n\n## 📸 Demo App  \n![demo-flutter-clip-link](https://github.com/user-attachments/assets/3907cd90-6320-41b4-a05e-32f24394c111)\n\n\n## 🏗️ Architecture \n\nThe architecture of the **Flutter Clip Link app** is based on the **bloc architecture** guidelines, which promotes a clean and organized codebase. \n\nRead more about the architecture [here](https://bloclibrary.dev/architecture).\n\n\n## 📁 Project Structure \n\u003cdetails\u003e\n\u003csummary\u003eClick to toggle contents of Project Structure\u003c/summary\u003e\n\n--- \nClip link app use project structure as follows:\n\n```bash\nflutter_clip_link\n├── lib\n│   ├── main.dart\n│   ├── src\n│   |   ├── core\n│   |   ├── features\n│   │   │   ├── favorited\n│   │   │   ├── main\n│   │   │   ├── search\n│   │   │   ├── settings\n│   │   │   ├── shorten\n│   │   │   ├── splash\n│   │   ├── routes\n│   │   ├── app.dart\n│   │   ├── init_di.dart   \n├── test\n```\n\nHere's the explanation in list form:\n\n- **lib**: Main directory for application code.\n  - **main.dart**: Entry point for the Flutter application.\n  - **src**: Contains core components and feature-specific modules.\n    - **core**: Shared resources and configurations (e.g., utilities, constants, theme settings).\n    - **features**: Modules for different functionalities, organized as follows:\n      - **favorited**: Manages user-favorited links.\n      - **main**: Main interface or dashboard for the app.\n      - **search**: Provides search capabilities within the app.\n      - **settings**: Manages user preferences and app settings.\n      - **shorten**: Contains logic for URL shortening functionality.\n      - **splash**: Displays the splash screen, typically the app’s first screen.\n    - **routes**: Configures app navigation and routing.\n    - **app.dart**: Contains the main app widget structure and setup.\n    - **init_di.dart**: Manages dependency injection, initializing services and dependencies.\n- **test**: Directory for unit and widget tests, ensuring feature reliability and performance.\n\n\u003e This organized structure supports scalability and maintainability, following a modular approach that simplifies adding and updating features.\n\n\n\u003c/details\u003e\n\n## ⛷️ Custom Packages\nThis project has three custom packages for easier and more efficient development, all created and tested by me:\n\n1. **clip_link_database**  \n   Manages local database operations for reliable data storage and retrieval.\n\n2. **clip_link_repository**  \n   Connects application logic to data sources for clear and scalable code.\n\n3. **spoo_me_api**  \n   Integrates with Spoo.me API for functions like link shortening\n\n## 📍 Routes \n\nThe **routes** folder serves as the central point for managing the navigation in the app. It contains two main files that handle the application's routing: `routes.dart` and `app_router.dart`.\n\n\n\u003cdetails\u003e\n\u003csummary\u003eroutes.dart \u003c/summary\u003e\n\n\nThe `routes.dart` file stores all the route names used throughout the app. Each route has a unique string identifier that will be used to navigate between pages or screens in the application.\n\nCode in this file:\n```dart\nenum Routes {\n  splash('/'),\n  listShorten('/list-shorten'),\n  addNewShortenURL('add-new-shorten-url'),\n  detailShortenURL('detail-shorten-url'),\n  listFavorites('/list-favorites'),\n  search('search'),\n  settings('/settings'),\n  about('about'),\n  faq('faq');\n\n  const Routes(this.path);\n  final String path;\n}\n```\nThe route names are created with enums, which are a special type of class that can be used to define a set of named constants.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e app_router.dart\u003c/summary\u003e\n\n\nThe `app_router.dart` file is responsible for **router configuration** using the `go_router` package. \n\nGoRouter is used to manage navigation logic, including conditional routes, dynamic routes, and nested routes. GoRouter also supports more complex route management, such as passing parameters or handling nested routes.\n\nExample Structure of `app_router.dart`:\n```dart\nimport 'package:go_router/go_router.dart';\nimport 'routes.dart';\nimport 'package:your_app/pages/home_page.dart';\nimport 'package:your_app/pages/login_page.dart';\n\nfinal GoRouter appRouter = GoRouter(\n  routes: [\n    GoRoute(\n      path: AppRoutes.home,\n      builder: (context, state) =\u003e HomePage(),\n    ),  \n    // Add other routes here\n  ],\n);\n```\n\n## 🚀 Get Started \nBefore you start, make sure you have the following installed:\n\n| Dart       | Flutter   | DevTools  |\n| ---------- | --------- | --------- |\n| `3.6.1` | `3.27.3` | `2.40.2`    |\n\n\n### Clone the repo\n- Clone the repo\n```bash\ngit clone https://github.com/utrodus/flutter_clip_link\n```\n\n### 📦 Install dependencies\nrun the following command to install all the dependencies\n```bash\nflutter pub get\n```\n\n### 🧑‍💻 Run the app\n- in Visual Studio Code, navigate to run and debug section\n- choose the `flutter_clip_link` configuration\n  - if you choose `flutter_clip_link`, it will run in debug mode in selected device\n  - for web, choose `flutter_clip_link (web)`\n\n\u003e Now you're ready to go! 🚀\n\n\nIn this file, each route name from `routes.dart` is connected to its corresponding widget, such as `HomePage()`. \n\n\u003c/details\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Futrodus%2Fflutter-clip-link","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Futrodus%2Fflutter-clip-link","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Futrodus%2Fflutter-clip-link/lists"}