app_dropdown_search.dart 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import 'package:dropdown_search/dropdown_search.dart';
  2. import 'package:flutter/material.dart';
  3. import '../themes/themes.dart';
  4. class AppDropdownSearch extends StatelessWidget {
  5. final void Function(dynamic)? onChanged;
  6. final dynamic selectedItem;
  7. final String? etiqueta;
  8. final TextEditingController controller;
  9. final String Function(dynamic)? itemAsString;
  10. final Future<List<dynamic>> Function(String)? asyncItems;
  11. final bool enabled;
  12. final List<dynamic> items;
  13. final String? Function(dynamic)? validator;
  14. final dynamic Function()? onPressedClear;
  15. const AppDropdownSearch({
  16. super.key,
  17. required this.controller,
  18. this.itemAsString,
  19. this.asyncItems,
  20. this.etiqueta,
  21. this.selectedItem,
  22. this.onChanged,
  23. this.onPressedClear,
  24. this.validator,
  25. this.enabled = true,
  26. this.items = const [],
  27. });
  28. double _getFontSize(BuildContext context) {
  29. double screenWidth = MediaQuery.of(context).size.width;
  30. if (screenWidth < 480) {
  31. return 12;
  32. } else if (screenWidth < 800) {
  33. return 15;
  34. }
  35. return 18;
  36. }
  37. @override
  38. Widget build(BuildContext context) {
  39. double fontSize = _getFontSize(context);
  40. TextStyle dropdownTextStyle = TextStyle(fontSize: fontSize);
  41. return Column(
  42. crossAxisAlignment: CrossAxisAlignment.start,
  43. children: [
  44. if (etiqueta != null)
  45. Text(
  46. etiqueta.toString(),
  47. style: TextStyle(fontSize: fontSize, fontWeight: FontWeight.bold),
  48. ),
  49. if (etiqueta != null) const SizedBox(height: 5),
  50. DropdownSearch(
  51. clearButtonProps: ClearButtonProps(
  52. onPressed: onPressedClear,
  53. isVisible: true,
  54. icon: const Icon(Icons.clear),
  55. iconSize: 20,
  56. ),
  57. validator: validator,
  58. onChanged: onChanged,
  59. asyncItems: asyncItems,
  60. items: items,
  61. itemAsString: itemAsString,
  62. selectedItem: selectedItem,
  63. enabled: enabled,
  64. popupProps: PopupProps.menu(
  65. emptyBuilder: (context, searchEntry) => Center(
  66. child:
  67. Text('No se encontro información', style: dropdownTextStyle),
  68. ),
  69. isFilterOnline: true,
  70. showSearchBox: true,
  71. searchFieldProps: TextFieldProps(
  72. // autofocus: true,
  73. controller: controller,
  74. decoration: InputDecoration(
  75. hintText: 'Teclee para buscar',
  76. hintStyle: dropdownTextStyle,
  77. suffixIcon: const Icon(Icons.search, color: Colors.grey),
  78. fillColor: Colors.white,
  79. focusedBorder: UnderlineInputBorder(
  80. // borderRadius: BorderRadius.circular(15),
  81. borderSide: BorderSide(color: AppTheme.tertiary),
  82. ),
  83. enabledBorder: const UnderlineInputBorder(
  84. // borderRadius: BorderRadius.circular(15),
  85. borderSide: BorderSide(color: Colors.grey),
  86. ),
  87. errorBorder: UnderlineInputBorder(
  88. // borderRadius: BorderRadius.circular(10),
  89. borderSide: BorderSide(
  90. color: Colors.grey[400]!,
  91. ),
  92. ),
  93. focusedErrorBorder: UnderlineInputBorder(
  94. // borderRadius: BorderRadius.circular(10),
  95. borderSide: BorderSide(
  96. color: AppTheme.primary,
  97. ),
  98. ),
  99. floatingLabelStyle: TextStyle(
  100. color: AppTheme.tertiary,
  101. fontSize: fontSize,
  102. ),
  103. ),
  104. ),
  105. ),
  106. dropdownDecoratorProps: DropDownDecoratorProps(
  107. baseStyle: dropdownTextStyle,
  108. dropdownSearchDecoration: InputDecoration(
  109. fillColor: Colors.white,
  110. suffixIcon: Icon(
  111. Icons.arrow_drop_down_circle,
  112. color: AppTheme.primary,
  113. ),
  114. focusedBorder: OutlineInputBorder(
  115. borderRadius: BorderRadius.circular(10),
  116. borderSide: BorderSide(
  117. color: AppTheme.tertiary,
  118. ),
  119. ),
  120. enabledBorder: OutlineInputBorder(
  121. borderRadius: BorderRadius.circular(10),
  122. borderSide: BorderSide(
  123. color: Colors.grey[400]!,
  124. ),
  125. ),
  126. errorBorder: OutlineInputBorder(
  127. borderRadius: BorderRadius.circular(10),
  128. borderSide: BorderSide(
  129. color: Colors.grey[300]!,
  130. ),
  131. ),
  132. focusedErrorBorder: OutlineInputBorder(
  133. borderRadius: BorderRadius.circular(10),
  134. borderSide: BorderSide(
  135. color: AppTheme.primary,
  136. ),
  137. ),
  138. disabledBorder: OutlineInputBorder(
  139. borderRadius: BorderRadius.circular(10),
  140. borderSide: BorderSide(
  141. color: Colors.grey[300]!,
  142. ),
  143. ),
  144. ),
  145. ),
  146. ),
  147. ],
  148. );
  149. }
  150. }