Una colección completa de widgets Flutter reutilizables y personalizables diseñados para acelerar el desarrollo de aplicaciones móviles. Cada widget sigue las mejores prácticas de Flutter, es completamente personalizable y mantiene consistencia visual con Material Design 3.
- 🎨 Diseño Adaptativo: Todos los widgets se adaptan automáticamente al tema de tu aplicación
- 📱 Responsive: Diseñados para funcionar perfectamente en diferentes tamaños de pantalla
- ⚡ Optimizado: Rendimiento optimizado y carga eficiente
- 🔧 Personalizable: Amplia gama de opciones de personalización
- 📖 Bien Documentado: Documentación completa con ejemplos de uso
- 🧪 Probado: Widgets probados y listos para producción
Agrega flutter_widgets
a tu pubspec.yaml
:
dependencies:
flutter_widgets:
git:
url: https://github.com/IQ-Tec/flutter-widgets.git
ref: v0.0.1
Luego ejecuta:
flutter pub get
Widgets para mostrar estados de la aplicación y retroalimentación al usuario:
ErrorCompact
: Mensaje de error compacto ideal para listas y formulariosErrorFullScreen
: Modal de error que cubre toda la pantalla para errores críticosErrorInline
: Widget de error para secciones específicas con diseño centradoLoadingSpinner
: Indicador de carga simple y elegante
import 'package:flutter_widgets/flutter_widgets.dart';
// Error compacto
ErrorCompact(
error: 'No se pudo cargar la información',
onRetry: () => _retry(),
)
// Indicador de carga
LoadingSpinner(
message: 'Cargando datos...',
color: Theme.of(context).primaryColor,
)
Elementos de interfaz interactivos para mejorar la experiencia del usuario:
CustomButton
: Botones personalizables con múltiples estilosCustomDropdown
: Dropdown con búsqueda integradaSwitchTile
: Switch con título y descripciónRatingBar
: Barra de calificación interactiva
Componentes avanzados para formularios con validación integrada:
CustomTextField
: Campo de texto con validaciónPasswordField
: Campo especializado para contraseñasDatePickerField
: Selector de fecha integradoFormBuilder
: Constructor de formularios dinámicos
Soluciones avanzadas para estructurar interfaces responsive:
ResponsiveLayout
: Layout adaptativo para diferentes pantallasFlexibleGrid
: Grid responsive y flexibleCustomSpacer
: Espaciador inteligenteStaggeredList
: Lista escalonada tipo Pinterest
import 'package:flutter/material.dart';
import 'package:flutter_widgets/flutter_widgets.dart';
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool _isLoading = false;
bool _hasError = false;
String _errorMessage = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Flutter Widgets Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (_isLoading)
LoadingSpinner(
message: 'Cargando datos...',
color: Theme.of(context).primaryColor,
)
else if (_hasError)
ErrorInline(
title: 'Error de Conexión',
error: _errorMessage,
onRetry: _loadData,
)
else
Text('¡Datos cargados correctamente!'),
SizedBox(height: 20),
ElevatedButton(
onPressed: _loadData,
child: Text('Cargar Datos'),
),
],
),
),
);
}
void _loadData() {
setState(() {
_isLoading = true;
_hasError = false;
});
// Simular carga de datos
Future.delayed(Duration(seconds: 2), () {
setState(() {
_isLoading = false;
// Simular error ocasional
if (DateTime.now().millisecond % 2 == 0) {
_hasError = true;
_errorMessage = 'Error al cargar los datos del servidor';
}
});
});
}
}
class DataListScreen extends StatefulWidget {
@override
_DataListScreenState createState() => _DataListScreenState();
}
class _DataListScreenState extends State<DataListScreen> {
List<String> _data = [];
bool _isLoading = true;
String? _error;
@override
void initState() {
super.initState();
_loadData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Lista de Datos')),
body: _buildBody(),
);
}
Widget _buildBody() {
if (_isLoading) {
return Center(
child: LoadingSpinner(
message: 'Cargando elementos...',
color: Theme.of(context).primaryColor,
),
);
}
if (_error != null) {
return ErrorInline(
title: 'Error al Cargar',
error: _error!,
onRetry: _loadData,
showRetryButton: true,
);
}
return ListView.builder(
itemCount: _data.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_data[index]),
trailing: Icon(Icons.arrow_forward_ios),
);
},
);
}
void _loadData() {
setState(() {
_isLoading = true;
_error = null;
});
// Simular carga desde API
Future.delayed(Duration(seconds: 1), () {
setState(() {
_isLoading = false;
// Simular datos o error
if (DateTime.now().second % 3 == 0) {
_error = 'No se pudo conectar al servidor. Verifica tu conexión a internet.';
} else {
_data = List.generate(20, (i) => 'Elemento ${i + 1}');
}
});
});
}
}
Cada categoría de widgets tiene su propia documentación detallada:
- 📢 Feedback Widgets - Estados de error y carga
- 🎛️ Control Widgets - Controles interactivos (Próximamente)
- 📝 Form Widgets - Componentes de formulario (Próximamente)
- 📐 Layout Widgets - Layouts responsive (Próximamente)
- Control Widgets básicos (CustomButton, CustomDropdown)
- Mejoras en widgets de feedback
- Tests unitarios completos
- Form Widgets con validación avanzada
- Layout Widgets responsive
- Temas personalizables
- Documentación interactiva
- Widgets de navegación
- Componentes de animación
- Widgets especializados para diferentes industrias
- Herramientas de desarrollo
¡Las contribuciones son bienvenidas! Si tienes ideas para nuevos widgets o mejoras, no dudes en:
- Hacer fork del proyecto
- Crear una rama para tu feature (
git checkout -b feature/nuevo-widget
) - Commit tus cambios (
git commit -am 'Añadir nuevo widget'
) - Push a la rama (
git push origin feature/nuevo-widget
) - Crear un Pull Request
- Sigue las convenciones de código de Dart/Flutter
- Incluye documentación completa para nuevos widgets
- Añade tests unitarios para nuevas funcionalidades
- Mantén la consistencia con el diseño existente
- Actualiza el CHANGELOG.md con tus cambios
Este proyecto está licenciado bajo la Licencia MIT - ver el archivo LICENSE para más detalles.
- Equipo de Flutter por el increíble framework
- Comunidad de desarrolladores Flutter por la inspiración
- Material Design team por las guías de diseño
Hecho con ❤️ por IQ-Tec