Skip to content

Instantly share code, notes, and snippets.

@AdelDaniel
Last active July 6, 2025 11:07
Show Gist options
  • Select an option

  • Save AdelDaniel/20a70f17c84c57abb302671633106709 to your computer and use it in GitHub Desktop.

Select an option

Save AdelDaniel/20a70f17c84c57abb302671633106709 to your computer and use it in GitHub Desktop.

πŸ“± Project Title: Flutter Assignment

🧩 Overview

Congratulations on making it to the next stage of our selection process! We're excited to learn more about how you think, build, and write code.

As the next step, we’d like you to complete a Flutter assignment.

This app simulates a real-world feature set where users can:

  • Browse a list of vendors.
  • View vendor details and follow/unfollow them.
  • Submit a collaboration request to a vendor through a form.

The goal is to assess your ability to write modular, scalable, and clean Flutter code, with a focus on working with REST APIs, adaptive UIs, and effective state management using Bloc.

πŸ•’ Deadline: 7 days from the day you receive this task.


🎯 Project Requirements

πŸ”· 1. Home Screen

  • Load and display a list of vendors from a local JSON file, simulating a GET /vendors API.

  • Each vendor card should include:

    • Vendor name
    • Vendor image
    • Follow/Unfollow button (based on is_follow from the JSON)
  • Toggling the follow state should mimic POST /vendors/{id}/follow or /unfollow.

πŸ”· 2. Vendor Details Screen

  • Tapping on a vendor card opens the details screen.

  • This screen should show:

    • Vendor name
    • Vendor image
    • Full vendor bio
    • Follower count or similar vendor stats
    • A "Request Collaboration" button to open the form screen

πŸ”· 3. Request Collaboration Form

  • The form should include:

    • Project Title – Required
    • Description – Multiline, Required
    • Budget – Optional numeric input
  • Implement proper form validation:

    • Show inline error messages for invalid fields.
    • Show a toast/snackbar on successful submission.
    • Display a loading indicator while submitting.

🧰 Tools & Packages

  • State Management: flutter_bloc
  • Networking: Dio
  • Routing: go_router or Navigator
  • Form & UI: Form widgets + Flutter best practices

You’re expected to separate business logic from UI using clean architecture principles or a layered structure.


πŸ§ͺ Bonus Tasks (Optional)

  • Persist the follow state using shared_preferences.
  • Add pull-to-refresh on the vendor list.
  • Add a simple animation when following/unfollowing a vendor.
  • Implement global error handling and loading indicators.
  • Apply Material Design principles.
  • Make the layout responsive for phones and tablets.

πŸ“‚ Submission Checklist

  • βœ… Push your code to a GitHub repository

  • βœ… Include a README.md file with:

    • Project setup instructions
    • Brief description of your app architecture

πŸŽ‰ Good Luck – We’re Excited to See Your Work!

  • If you have any questions, feel free to reach out for clarification.
{
"success": true,
"message": "",
"data": [
{
"id": 138,
"image": "https://images.unsplash.com/photo-1555274175-75f4056dfd05?q=80&w=2070&auto=format&fit=crop",
"store_name": "Adidas",
"email": "info@adidas.com",
"maincategory": "Woman",
"followers_count": 100,
"is_follow": false,
"establish_date": "1998-01-01",
"bio": "Adidas creates performance-focused apparel, footwear, and accessories for athletes and everyday use. Known for innovation and style."
},
{
"id": 43,
"image": "https://images.unsplash.com/photo-1608541737042-87a12275d313?w=900&auto=format&fit=crop",
"store_name": "Nike",
"email": "info@nike.com",
"maincategory": "Men",
"followers_count": 12,
"is_follow": true,
"establish_date": "1998-01-01",
"bio": "Nike delivers cutting-edge sportswear designed for comfort and performance. Its mission is to bring inspiration to every athlete."
},
{
"id": 85,
"image": "https://images.unsplash.com/photo-1651853082689-706323a31427?w=900&auto=format&fit=crop",
"store_name": "Prada",
"email": "info@prada.com",
"maincategory": "Others",
"followers_count": 3,
"is_follow": false,
"establish_date": "1898-01-01",
"bio": "Prada blends luxury fashion with timeless craftsmanship. A symbol of elegance and bold design choices."
},
{
"id": 204,
"image": "https://images.unsplash.com/photo-1523381210434-271e8be1f52b?w=900&auto=format&fit=crop",
"store_name": "Dark Knight Store",
"email": "darkknight@brand.com",
"maincategory": "Woman",
"followers_count": 122348909,
"is_follow": false,
"establish_date": "1998-12-01",
"bio": "Dark Knight is a mysterious fashion brand combining minimalism with powerful storytelling through apparel."
},
{
"id": 201,
"image": "https://images.unsplash.com/photo-1523381210434-271e8be1f52b?w=900&auto=format&fit=crop",
"store_name": "Fashion of Woman",
"email": "info@fashion.com",
"maincategory": "Men",
"followers_count": 1223489092,
"is_follow": true,
"establish_date": "1998-12-01",
"bio": "Fashion of Woman is a unisex line embracing diversity and creative expression through versatile collections."
},
{
"id": 200,
"image": "https://images.unsplash.com/photo-1600091106645-2e76e1787372?w=900&auto=format&fit=crop",
"store_name": "Groom",
"email": "info@groom.com",
"maincategory": "Men",
"followers_count": 0,
"is_follow": false,
"establish_date": "1998-01-01",
"bio": "Groom is a men's grooming and lifestyle brand focused on premium essentials for the modern man."
},
{
"id": 193,
"image": "https://images.unsplash.com/photo-1550129158-ecf8f8fce8af?w=900&auto=format&fit=crop",
"store_name": "Fisherman",
"email": "info@fisherman.com",
"maincategory": "Woman",
"followers_count": 85,
"is_follow": false,
"establish_date": "1998-01-01",
"bio": "Fisherman is inspired by coastal heritage, crafting durable, stylish wear for outdoor enthusiasts."
},
{
"id": 175,
"image": "https://images.unsplash.com/photo-1653032352741-47204a1d33e1?w=900&auto=format&fit=crop",
"store_name": "Bonbon",
"email": "info@bonbon.com",
"maincategory": "Kids",
"followers_count": 248,
"is_follow": false,
"establish_date": "1998-01-01",
"bio": "Bonbon is a colorful and joyful kidswear brand blending playfulness with practicality for children of all ages."
}
],
"links": {
"first": "https://api.brands.api/brands?page=1",
"last": "https://api.brands.api/brands?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{ "url": null, "label": "« Previous", "active": false },
{
"url": "https://api.brands.api/brands?page=1",
"label": "1",
"active": true
},
{ "url": null, "label": "Next »", "active": false }
],
"path": "https://api.brands.api/brands",
"per_page": 15,
"to": 8,
"total": 8
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment