AppUI class

Acceso rápido y conveniente a constantes UI comúnmente usadas

AppUI es una clase de conveniencia que proporciona acceso directo a valores frecuentemente utilizados de AppSizes, sin necesidad de recordar qué archivo importar. Todos los valores están delegados a AppSizes para mantener una única fuente de verdad en el sistema de diseño.

🎯 ¿Cuándo usar AppUI vs AppSizes?

Usa AppUI cuando:

  • Trabajas con elevaciones, opacidades, iconos o avatares
  • Necesitas breakpoints responsivos
  • Quieres acceso rápido sin pensar en imports
  • Estás escribiendo código de UI común

Usa AppSizes cuando:

  • Necesitas valores de la escala base (md, lg, xl, etc.)
  • Trabajas con dimensiones personalizadas
  • Necesitas acceso a aspect ratios

📦 Categorías Disponibles

  1. Elevaciones - Profundidad de sombras (Material Design)
  2. Opacidades - Niveles de transparencia (Material Design)
  3. Tamaños de Iconos - Dimensiones estandarizadas
  4. Tamaños de Avatares - Radios predefinidos
  5. Breakpoints - Anchos máximos responsivos
  6. Aspect Ratios - Proporciones comunes

🎨 Uso Básico

// ✅ Elevaciones - Profundidad de sombras
Card(
  elevation: AppUI.elevationMd,  // 4.0 - Estándar
  child: Content(),
)

// ✅ Opacidades - Estados y jerarquía
Opacity(
  opacity: AppUI.opacityDisabled,  // 0.38 - Deshabilitado
  child: Text('No disponible'),
)

// ✅ Iconos - Tamaños consistentes
Icon(
  Icons.home,
  size: AppUI.iconLg,  // 24.0 - Estándar Material
)

// ✅ Avatares - Radios predefinidos
CircleAvatar(
  radius: AppUI.avatarMd,  // 40.0 - Lista estándar
  child: Text('JD'),
)

// ✅ Breakpoints - Diseño responsive
final width = MediaQuery.of(context).size.width;
if (width < AppUI.maxMobileWidth) {
  return MobileLayout();
} else if (width < AppUI.maxTabletWidth) {
  return TabletLayout();
} else {
  return DesktopLayout();
}

// ✅ Aspect Ratios - Proporciones
AspectRatio(
  aspectRatio: AppUI.aspectRatioWide,  // 16:9
  child: Image.network('url'),
)

🎭 Elevaciones (Material Design)

Profundidad de sombras según contexto:

// Cards en reposo
Card(elevation: AppUI.elevationXs)  // 1.0

// Botones, chips
ElevatedButton(elevation: AppUI.elevationSm)  // 2.0

// Cards elevadas, app bar ⭐
Card(elevation: AppUI.elevationMd)  // 4.0

// Floating Action Button
FloatingActionButton(elevation: AppUI.elevationLg)  // 6.0

// Drawer, bottom sheet
Drawer(elevation: AppUI.elevationXl)  // 8.0

// Dialogs
Dialog(elevation: AppUI.elevationXxl)  // 12.0

// Navigation drawer
NavigationDrawer(elevation: AppUI.elevationHuge)  // 16.0

// Modal bottom sheet
showModalBottomSheet(elevation: AppUI.elevationMassive)  // 24.0

🌫️ Opacidades (Material Design)

Niveles de transparencia para estados y jerarquía:

// Hover/press effects
Color.withOpacity(AppUI.opacityHover)  // 0.12

// Elementos deshabilitados
Opacity(
  opacity: AppUI.opacityDisabled,  // 0.38
  child: DisabledButton(),
)

// Texto secundario, ayuda
Text(
  'Texto secundario',
  style: TextStyle(
    color: Colors.black.withOpacity(AppUI.opacityMedium),  // 0.54
  ),
)

// Elementos menos importantes
Icon(
  Icons.info,
  color: Colors.black.withOpacity(AppUI.opacityMediumHigh),  // 0.70
)

// Texto principal ⭐
Text(
  'Texto principal',
  style: TextStyle(
    color: Colors.black.withOpacity(AppUI.opacityHigh),  // 0.87
  ),
)

// Completamente opaco
Container(
  color: Colors.blue.withOpacity(AppUI.opacityFull),  // 1.0
)

📱 Tamaños de Iconos

Dimensiones estandarizadas según contexto:

// Badges, indicadores
Icon(Icons.circle, size: AppUI.iconXs)  // 12.0

// Inputs, campos de texto
Icon(Icons.search, size: AppUI.iconSm)  // 16.0

// Botones estándar
Icon(Icons.add, size: AppUI.iconMd)  // 20.0

// Estándar Material Design ⭐
Icon(Icons.home, size: AppUI.iconLg)  // 24.0

// Headers, títulos
Icon(Icons.star, size: AppUI.iconXl)  // 32.0

// Hero sections
Icon(Icons.favorite, size: AppUI.iconXxl)  // 40.0

// Splash screens
Icon(Icons.logo, size: AppUI.iconHuge)  // 48.0

👤 Tamaños de Avatares

Radios predefinidos para CircleAvatar:

// Listas compactas, chips
CircleAvatar(radius: AppUI.avatarXs)  // 24.0

// Chips, tags pequeños
CircleAvatar(radius: AppUI.avatarSm)  // 32.0

// Listas estándar ⭐
CircleAvatar(radius: AppUI.avatarMd)  // 40.0

// Detalles, cards
CircleAvatar(radius: AppUI.avatarLg)  // 48.0

// Perfiles, headers
CircleAvatar(radius: AppUI.avatarXl)  // 64.0

// Perfiles destacados
CircleAvatar(radius: AppUI.avatarXxl)  // 80.0

// Hero sections
CircleAvatar(radius: AppUI.avatarHuge)  // 96.0

// Página de perfil completa
CircleAvatar(radius: AppUI.avatarMassive)  // 128.0

📐 Breakpoints Responsivos

Anchos máximos para diferentes dispositivos:

// Ejemplo: Layout responsive completo
Widget build(BuildContext context) {
  final width = MediaQuery.of(context).size.width;

  // Mobile: < 600px
  if (width < AppUI.maxMobileWidth) {
    return MobileLayout(
      padding: AppSpacing.paddingLg,  // 16.0
      columns: 1,
    );
  }

  // Tablet: 600px - 900px
  if (width < AppUI.maxTabletWidth) {
    return TabletLayout(
      padding: AppSpacing.paddingXl,  // 20.0
      columns: 2,
    );
  }

  // Desktop: 900px - 1200px
  if (width < AppUI.maxDesktopWidth) {
    return DesktopLayout(
      padding: AppSpacing.paddingXxl,  // 24.0
      columns: 3,
    );
  }

  // Large Desktop: > 1200px
  return Container(
    constraints: BoxConstraints(
      maxWidth: AppUI.maxContentWidth,  // 1536.0 - Contenido centrado
    ),
    child: WideDesktopLayout(
      padding: AppSpacing.paddingHuge,  // 32.0
      columns: 4,
    ),
  );
}

// Ejemplo: Utility para obtener tipo de dispositivo
DeviceType getDeviceType(BuildContext context) {
  final width = MediaQuery.of(context).size.width;
  if (width < AppUI.maxMobileWidth) return DeviceType.mobile;
  if (width < AppUI.maxTabletWidth) return DeviceType.tablet;
  return DeviceType.desktop;
}

📏 Aspect Ratios

Proporciones comunes para imágenes y media:

// Cuadrado - Posts de redes sociales
AspectRatio(
  aspectRatio: AppUI.aspectRatioSquare,  // 1:1
  child: Image.network('url'),
)

// Estándar - Fotografía tradicional
AspectRatio(
  aspectRatio: AppUI.aspectRatioStandard,  // 4:3
  child: Image.network('url'),
)

// Foto - Cámaras DSLR
AspectRatio(
  aspectRatio: AppUI.aspectRatioPhoto,  // 3:2
  child: Image.network('url'),
)

// Widescreen - Videos, pantallas ⭐
AspectRatio(
  aspectRatio: AppUI.aspectRatioWide,  // 16:9
  child: VideoPlayer(),
)

// Cinemático - Películas, ultra-wide
AspectRatio(
  aspectRatio: AppUI.aspectRatioCinematic,  // 21:9
  child: MovieClip(),
)

💡 Consejos de Uso

  1. Import único: Solo necesitas import 'package:flutter_const/constants/app_ui.dart'
  2. Elevaciones: Sigue Material Design para consistencia
  3. Opacidades: Usa valores de texto para cumplir WCAG (accesibilidad)
  4. Breakpoints: Considera orientación del dispositivo también
  5. Aspect Ratios: Útil con FittedBox y Image.fit

✅ Ventajas

  • Conveniencia: Acceso rápido sin recordar qué importar
  • Descubribilidad: IDE autocomplete muestra todas las opciones
  • Consistencia: Valores estandarizados en toda la app
  • Accesibilidad: Valores optimizados para WCAG
  • Responsive: Breakpoints predefinidos

🔗 Ver también

📚 Referencias

Properties

hashCode int
The hash code for this object.
no setterinherited
runtimeType Type
A representation of the runtime type of the object.
no setterinherited

Methods

noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toString() String
A string representation of this object.
inherited

Operators

operator ==(Object other) bool
The equality operator.
inherited

Constants

aspectRatioCinematic → const double
2.35 - Cinemático (21:9) - Películas y ultra-wide
aspectRatioPhoto → const double
1.5 - Formato foto (3:2) - Cámaras DSLR
aspectRatioSquare → const double
1.0 - Cuadrado perfecto (1:1)
aspectRatioStandard → const double
1.33 - Formato estándar (4:3) - Común en fotografía tradicional
aspectRatioWide → const double
1.78 - Widescreen (16:9) - Videos y pantallas modernas
avatarHuge → const double
96.0 - Avatar enorme
avatarLg → const double
48.0 - Avatar grande
avatarMassive → const double
128.0 - Avatar masivo (para perfiles)
avatarMd → const double
40.0 - Avatar mediano (uso común en listas)
avatarSm → const double
32.0 - Avatar pequeño
avatarXl → const double
64.0 - Avatar extra grande
avatarXs → const double
24.0 - Avatar extra pequeño
avatarXxl → const double
80.0 - Avatar muy grande
elevationHuge → const double
16.0 - Elevación enorme (navigation drawer)
elevationLg → const double
6.0 - Elevación media (floating action button)
elevationMassive → const double
24.0 - Elevación masiva (modal bottom sheet)
elevationMd → const double
4.0 - Elevación estándar (cards elevadas, app bar)
elevationNone → const double
0.0 - Sin elevación
elevationSm → const double
2.0 - Elevación baja (botones, chips)
elevationXl → const double
8.0 - Elevación alta (drawer, bottom sheet)
elevationXs → const double
1.0 - Elevación mínima (cards en reposo)
elevationXxl → const double
12.0 - Elevación muy alta (dialogs)
iconHuge → const double
48.0 - Ícono enorme
iconLg → const double
24.0 - Tamaño estándar de Material Design
iconMd → const double
20.0 - Ícono mediano
iconSm → const double
16.0 - Ícono pequeño
iconXl → const double
32.0 - Ícono extra grande
iconXs → const double
12.0 - Ícono extra pequeño
iconXxl → const double
40.0 - Ícono muy grande
maxContentWidth → const double
1536.0 - Ancho máximo para contenido centrado
maxDesktopWidth → const double
1200.0 - Ancho máximo para desktop
maxMobileWidth → const double
600.0 - Ancho máximo para dispositivos móviles
maxTabletWidth → const double
900.0 - Ancho máximo para tablets
opacityDisabled → const double
0.38 - Estado deshabilitado (texto e iconos)
opacityFull → const double
1.0 - Completamente opaco
opacityHigh → const double
0.87 - Texto activo y primario
opacityHover → const double
0.12 - Hover/Press sobre superficie (ripple effects)
opacityMedium → const double
0.54 - Texto secundario y ayuda
opacityMediumHigh → const double
0.70 - Nivel medio-alto (elementos menos importantes)
opacityNone → const double
0.0 - Completamente transparente