app_dropdown_modelo.dart 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import 'package:flutter/material.dart';
  2. import '../themes/themes.dart';
  3. class AppDropdownModel<T> extends StatelessWidget {
  4. final String? etiqueta;
  5. final String? hint;
  6. final T? selectedValue;
  7. final void Function(T?)? onChanged;
  8. final List<DropdownMenuItem<T>>? items;
  9. const AppDropdownModel({
  10. super.key,
  11. this.etiqueta,
  12. this.hint,
  13. this.selectedValue,
  14. this.onChanged,
  15. required this.items,
  16. });
  17. double _getFontSize(BuildContext context) {
  18. double screenWidth = MediaQuery.of(context).size.width;
  19. if (screenWidth < 480) {
  20. return 12;
  21. } else if (screenWidth < 800) {
  22. return 15;
  23. }
  24. return 18;
  25. }
  26. @override
  27. Widget build(BuildContext context) {
  28. double fontSize = _getFontSize(context);
  29. TextStyle dropdownTextStyle = TextStyle(fontSize: fontSize);
  30. return Column(
  31. crossAxisAlignment: CrossAxisAlignment.start,
  32. children: [
  33. if (etiqueta != null &&
  34. etiqueta!
  35. .isNotEmpty) // Verifica si la etiqueta no es nula y no está vacía
  36. Text(
  37. etiqueta!,
  38. style: TextStyle(
  39. fontSize: fontSize,
  40. fontWeight: FontWeight.bold,
  41. ),
  42. ),
  43. if (etiqueta != null &&
  44. etiqueta!.isNotEmpty) // Solo muestra el espacio si hay una etiqueta
  45. const SizedBox(
  46. height: 5,
  47. ),
  48. Container(
  49. decoration: BoxDecoration(
  50. color: Colors.white, borderRadius: BorderRadius.circular(15)),
  51. child: DropdownButtonFormField(
  52. hint: Text(hint ?? '',
  53. style:
  54. dropdownTextStyle), // Usa un hint vacío si no se proporciona
  55. style: dropdownTextStyle,
  56. borderRadius: BorderRadius.circular(10),
  57. icon: Icon(
  58. Icons.arrow_drop_down_circle,
  59. color: AppTheme.primary,
  60. ),
  61. decoration: InputDecoration(
  62. floatingLabelStyle: TextStyle(
  63. color: AppTheme.primary,
  64. fontSize: fontSize,
  65. ),
  66. labelStyle: TextStyle(color: Colors.grey, fontSize: fontSize),
  67. focusedBorder: OutlineInputBorder(
  68. borderRadius: BorderRadius.circular(15),
  69. borderSide: BorderSide(color: AppTheme.tertiary),
  70. ),
  71. enabledBorder: OutlineInputBorder(
  72. borderRadius: BorderRadius.circular(15),
  73. borderSide: const BorderSide(color: Colors.grey),
  74. ),
  75. ),
  76. value: selectedValue,
  77. items: items,
  78. onChanged: onChanged,
  79. ),
  80. ),
  81. ],
  82. );
  83. }
  84. }