Template oficial de dev3ch para proyectos Flutter. Repositorio GitHub Template con estructura feature-first, auth completo con JWT y las dependencias del equipo ya configuradas.
dart pub global activate very_good_cli
very_good create flutter_app mi_app --org com.dev3ch --desc "Mi aplicación"# 1. "Use this template" en GitHub → github.com/dev3ch/flutter-template
# 2. git clone del repo generado
# 3. Renombrar el package Dart (reemplaza TODOS los imports `package:dev3ch_template/`):
APP_NAME=mi_app
find . -type f \( -name "*.dart" -o -name "pubspec.yaml" \) \
-exec sed -i "s/dev3ch_template/${APP_NAME}/g" {} +
# 4. Copiar .env y ajustar API_BASE_URL
cp .env.example .env
# 5. Instalar dependencias
flutter pub get
# 6. Generar código (freezed, riverpod, json_serializable)
dart run build_runner build --delete-conflicting-outputs
# 7. (Android/iOS) renombrar applicationId / bundleId a mano en android/app/build.gradle y ios/Runner.xcodeprojlib/
├── core/
│ ├── http/
│ │ ├── http_client.dart # Dio instance singleton
│ │ ├── auth_interceptor.dart # Inyecta JWT, maneja refresh en 401
│ │ └── error_interceptor.dart # Normaliza errores DioException
│ ├── auth/
│ │ └── secure_storage.dart # flutter_secure_storage wrapper
│ ├── router/
│ │ └── router.dart # go_router con auth guard
│ └── providers/
│ └── core_providers.dart # Providers de Dio, Storage
├── features/
│ └── auth/ # Feature de auth completo
│ ├── data/
│ │ ├── models/
│ │ │ └── user.dart # @freezed User model
│ │ └── services/
│ │ └── auth_service.dart # login(), register(), refresh()
│ ├── domain/
│ │ └── auth_repository.dart # Interface
│ └── presentation/
│ ├── providers/
│ │ └── auth_provider.dart # Riverpod notifier
│ ├── screens/
│ │ ├── login_screen.dart
│ │ └── register_screen.dart
│ └── widgets/
│ └── login_form.dart
└── main.dart # ProviderScope + MaterialApp.router
AuthInterceptor— inyecta Bearer token desdeSecureStorage- Refresh automático en 401 — reintenta el request original
go_routercon redirect guard — si no hay token →/loginLoginScreenyLoginFormfuncionales conreactive_formsUsermodel con@freezed(camelCase compatible con Django)AuthNotifiercon Riverpod —login(),logout(), estado de sesión
dependencies:
dio: ^5.7.0
flutter_riverpod: ^2.5.1
riverpod_annotation: ^2.3.5
go_router: ^14.2.7
freezed_annotation: ^2.4.4
json_annotation: ^4.9.0
flutter_secure_storage: ^9.2.2
reactive_forms: ^17.0.1
flutter_dotenv: ^5.1.0
dev_dependencies:
build_runner: ^2.4.13
freezed: ^2.5.7
json_serializable: ^6.8.0
riverpod_generator: ^2.4.3
very_good_analysis: ^6.0.0
mocktail: ^1.0.4Crear la carpeta bajo features/ siguiendo la misma estructura de auth/:
features/
└── mi_feature/
├── data/
│ ├── models/
│ └── services/
├── domain/
└── presentation/
├── providers/
├── screens/
└── widgets/
flutter upgrade # Actualizar Flutter SDK
flutter pub upgrade # Actualizar dependencias
dart run build_runner build --delete-conflicting-outputs # Regenerar código- Flutter + Dart
- Riverpod (state management)
- go_router (navegación con auth guard)
- Dio (HTTP + interceptors)
- freezed + json_serializable (modelos)
- reactive_forms (formularios)
- flutter_secure_storage (tokens)