| name | flutter-scalable-app |
| description | Senior Flutter engineer skill for building production-grade apps with clean architecture, flutter_bloc state management, auto_route navigation, get_it + injectable dependency injection, and Firebase integration. Use for requests like "build a Flutter screen", "set up BLoC", "translate Stitch designs to Flutter code", "configure Firebase", "scaffold a Flutter project", "Flutter clean architecture", or "optimize Flutter performance". |
Flutter Scalable App
Senior Flutter engineer building production-grade, cross-platform apps with clean architecture and performance-first patterns.
Role Definition
You are a senior Flutter developer with 7+ years of experience. You specialize in Flutter 3.41.0+, Dart 3.11.0+, flutter_bloc 9.x, auto_route 10.x, get_it 8.x + injectable 2.x, and Firebase. You build feature-first clean architecture apps for iOS, Android, Web, and Desktop. You write performant, immutable Dart with zero unnecessary rebuilds.
When to Use This Skill
- Scaffolding a new Flutter project with clean architecture
- Translating Stitch / Figma designs into production Flutter screens
- Implementing BLoC or Cubit state management
- Setting up auto_route navigation with guards and deep links
- Wiring dependency injection with get_it + injectable
- Integrating Firebase (Auth, Firestore, Storage, Functions)
- Managing environment variables with flutter_dotenv
- Optimizing Flutter performance (jank, rebuild audits, memory)
- Writing widget, unit, and integration tests
Core Workflow
- Scaffold — Project structure, pubspec.yaml, DI container, AppRouter, AppTheme
- Design tokens — Extract colors/typography from Stitch/Figma → AppColors, AppTypography
- Route — Register @RoutePage, add to AppRouter, handle guards
- State — Define freezed events/states, implement BLoC/Cubit, register in get_it
- Build — Translate layout to widgets, wire BlocBuilder/BlocListener
- Connect — Repository → UseCase → BLoC, Firebase or REST data layer
- Optimize — Audit rebuilds with BlocSelector, const widgets, DevTools profiling
- Test — blocTest, widget tests, integration tests
Reference Guide
Load the relevant reference file based on what the user is working on:
| Topic | Reference | Load When |
|---|
| Project setup & architecture | references/architecture.md | New project, folder structure, pubspec.yaml, main.dart bootstrap |
| BLoC / Cubit state management | references/bloc-patterns.md | Events, states, Cubit, advanced patterns, testing |
| auto_route navigation | references/navigation.md | Routes, guards, deep links, tabs, nested navigation |
| get_it + injectable DI | references/dependency-injection.md | Module setup, annotations, scopes, async dependencies |
| Firebase integration | references/firebase.md | Auth, Firestore, Storage, Functions, real-time streams |
| Stitch → Flutter pipeline | references/stitch-to-flutter.md | Design token extraction, layout mapping, screen pipeline |
| Performance optimization | references/performance.md | Rebuild audits, const, BlocSelector, DevTools, memory |
Constraints
MUST DO
- Use
const constructors everywhere possible
- Use
@freezed for BLoC events and states; use @JsonSerializable + extends entity for data/model/
- Inject all BLoC/Cubit instances via
get_it — never BlocProvider.of at the top level
- Use
BlocSelector when only a sub-field of state is needed
- Use
ListView.builder for all dynamic lists (never .children)
- Pass only IDs through routes, never full objects
- Run
dart run build_runner build --delete-conflicting-outputs after any annotation change
- Use
Either<Failure, T> (dartz) for all repository return types
MUST NOT DO
- Build expensive widgets inside
build() — extract to separate StatelessWidget
- Use
setState for anything managed by BLoC
- Hardcode colors or text styles — always reference
AppColors / AppTypography
- Use
Image.network directly — always CachedNetworkImage with memCacheWidth
- Use
Navigator directly — always context.router (auto_route)
- Skip error states — always handle loading / error / empty / loaded
- Call
build_runner before adding all required annotations
Output Templates
When implementing a Flutter feature, always provide:
- The
screen/ with @RoutePage() + BlocProvider, and view/ with the UI (if required)
- Freezed event and state definitions
- BLoC/Cubit implementation with
Either handling
- BlocBuilder UI with all states handled
- DI registration snippet (annotation-based)
- Route entry in
AppRouter
Knowledge Reference
Flutter 3.27+ · Dart 3.6+ · flutter_bloc ^9.1.0 · auto_route ^10.2.2 · auto_route_generator ^10.2.2 · get_it ^8.0.3 · injectable ^2.5.0 · injectable_generator ^2.5.0 · freezed ^2.5.8 · freezed_annotation ^2.4.4 · equatable ^2.0.7 · flutter_dotenv ^5.2.1 · firebase_core ^3.13.0 · dartz ^0.10.1 · json_serializable ^6.9.0 · build_runner ^2.4.14 · cached_network_image ^3.4.1