multi_selected.dart 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
  2. import 'package:fis_lib_report/pages/components/widgets/option_row.dart';
  3. import 'package:fis_lib_report/report/multi_selected.dart';
  4. import 'package:fis_lib_report/report/rt_color.dart';
  5. import 'package:fis_lib_report/report_info/multi_selected_info.dart';
  6. import 'package:fis_lib_report/report_info/report_info.dart';
  7. import 'package:fis_ui/index.dart';
  8. import 'package:fis_ui/usual/select/dropdown_button2.dart';
  9. import 'package:fis_ui/values/font_sizes.dart';
  10. import 'package:flutter/material.dart';
  11. // import 'package:dropdown_button2/dropdown_button2.dart';
  12. class FMultiSelected extends StatefulWidget implements FWidget {
  13. final MultiSelected multiSelected;
  14. const FMultiSelected(this.multiSelected, {Key? key}) : super(key: key);
  15. @override
  16. State<StatefulWidget> createState() {
  17. return _RRMultiSelectedState();
  18. }
  19. }
  20. class _RRMultiSelectedState extends State<FMultiSelected> {
  21. _RRMultiSelectedState();
  22. final String _value = '';
  23. String? _selectedItemView = '';
  24. List<String> _items = [];
  25. List<String> _selectedItems = [];
  26. double _width = 0.0;
  27. double _height = 0.0;
  28. double _fontSize = 0;
  29. MulitiSelectedInfo? _mulitiSelectedInfo;
  30. final EdgeInsetsGeometry _padding = const EdgeInsets.only(left: 4, right: 25);
  31. TextStyle _textStyle = const TextStyle();
  32. @override
  33. initState() {
  34. _initDatas();
  35. super.initState();
  36. }
  37. @override
  38. Widget build(BuildContext context) {
  39. final multiSelected = widget.multiSelected;
  40. final background = multiSelected.background ?? RTColor(255, 255, 255, 255);
  41. return Stack(
  42. children: [
  43. FContainer(
  44. decoration: BoxDecoration(
  45. border: Border.all(color: Colors.grey, width: 1.0),
  46. borderRadius: BorderRadius.circular(4),
  47. color: Color.fromARGB(
  48. background.a!, background.r!, background.g!, background.b!),
  49. ),
  50. padding: _padding,
  51. width: _width,
  52. height: _height,
  53. child: FText(
  54. _selectedItemView!,
  55. maxLines: 1,
  56. style: _textStyle,
  57. ),
  58. ),
  59. _buildDropdownButton(),
  60. ],
  61. );
  62. }
  63. List<DropdownMenuItem<String>> buildItems() {
  64. return _items.map((String e) {
  65. final active = e == _value;
  66. return DropdownMenuItem<String>(
  67. child: FOptionRow(
  68. widget.multiSelected,
  69. e,
  70. isActive: active,
  71. height: _height,
  72. onTap: () {
  73. if (mounted) {
  74. setState(() {
  75. _onSelectedItem(e);
  76. });
  77. }
  78. if (_mulitiSelectedInfo != null) {
  79. _mulitiSelectedInfo!.selectedItems = _selectedItems;
  80. }
  81. },
  82. isSelected: _selectedItems.contains(e),
  83. ),
  84. value: e,
  85. );
  86. }).toList();
  87. }
  88. _onSelectedItem(String value) {
  89. if (mounted) {
  90. setState(() {
  91. if (_selectedItems.contains(value)) {
  92. _selectedItems.remove(value);
  93. } else {
  94. _selectedItems.add(value);
  95. }
  96. String text = '';
  97. _getSelectedItems();
  98. });
  99. }
  100. }
  101. Widget _buildDropdownButton() {
  102. if (_items.isEmpty) {
  103. return const FSizedBox();
  104. }
  105. var buttonDecoration = BoxDecoration(
  106. border: Border.all(color: Colors.transparent, width: 1.0),
  107. borderRadius: BorderRadius.circular(4),
  108. color: Colors.transparent,
  109. );
  110. return SizedBox(
  111. height: _height,
  112. width: _width,
  113. child: DropdownButtonHideUnderline(
  114. child: DropdownButton2<String>(
  115. dropdownMaxHeight: 300,
  116. buttonWidth: _width,
  117. itemPadding: const EdgeInsets.symmetric(horizontal: 0, vertical: 2),
  118. itemHeight: 28,
  119. iconSize: FFontSizes.H5,
  120. isExpanded: false,
  121. dropdownOverButton: false,
  122. scrollbarAlwaysShow: true,
  123. scrollbarThickness: 4,
  124. scrollbarRadius: const Radius.circular(2),
  125. // buttonPadding: const EdgeInsets.symmetric(horizontal: 0, vertical: 0),
  126. dropdownDecoration: BoxDecoration(
  127. borderRadius: BorderRadius.circular(0),
  128. ),
  129. buttonDecoration: buttonDecoration,
  130. selectedItemHighlightColor: Theme.of(context).secondaryHeaderColor,
  131. selectedItemBuilder: (_) => _selectedItems.map((e) {
  132. return SizedBox(
  133. width: _width - 34,
  134. child: Text(
  135. e,
  136. maxLines: 1,
  137. ),
  138. );
  139. }).toList(),
  140. value: null,
  141. items: buildItems(),
  142. onChanged: (v) {},
  143. ),
  144. ),
  145. );
  146. }
  147. void _initDatas() {
  148. final multiSelected = widget.multiSelected;
  149. final selectInfo = FReportInfo.instance.getElementInfo(multiSelected);
  150. if (selectInfo != null && _mulitiSelectedInfo != selectInfo) {
  151. if (_mulitiSelectedInfo != null) {
  152. _mulitiSelectedInfo!.onSelectedChange.dispose();
  153. }
  154. _mulitiSelectedInfo = selectInfo as MulitiSelectedInfo;
  155. _mulitiSelectedInfo!.onSelectedChange.dispose();
  156. _mulitiSelectedInfo!.onSelectedChange.addListener((sender, e) {
  157. if (mounted) {
  158. setState(() {
  159. _selectedItems = e;
  160. _getSelectedItems();
  161. });
  162. }
  163. });
  164. }
  165. if (multiSelected.items!.isNotEmpty) {
  166. _items = multiSelected.items!;
  167. }
  168. if (_mulitiSelectedInfo != null &&
  169. _mulitiSelectedInfo!.selectedItems != _selectedItems) {
  170. _selectedItems = _mulitiSelectedInfo!.selectedItems;
  171. _getSelectedItems();
  172. }
  173. _width = PtToPxConverter.ptToPx(multiSelected.lineWidth);
  174. final fontColor = multiSelected.fontColor ?? RTColor.Black;
  175. _fontSize = PtToPxConverter.ptToPx(multiSelected.fontSize);
  176. _height = _fontSize + 10;
  177. _textStyle = TextStyle(
  178. color: Color.fromARGB(
  179. fontColor.a!, fontColor.r!, fontColor.g!, fontColor.b!),
  180. fontSize: _fontSize > FFontSizes.H5 ? FFontSizes.H5 : _fontSize,
  181. );
  182. }
  183. void _getSelectedItems() {
  184. String text = '';
  185. for (var element in _selectedItems) {
  186. final index = _selectedItems.indexOf(element);
  187. if (index > 0) {
  188. text = text + ';' + element;
  189. } else if (index == 0) {
  190. text = element;
  191. } else if (_selectedItems.isEmpty) {
  192. text = '';
  193. }
  194. }
  195. _selectedItemView = text;
  196. }
  197. }