single_select.dart 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import 'package:fis_lib_report/converts/pt_to_px_converter.dart';
  2. import 'package:fis_lib_report/report/singleSelected.dart';
  3. import 'package:fis_lib_report/report_info/report_info.dart';
  4. import 'package:fis_lib_report/report_info/single_selected_info.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:dropdown_button2/dropdown_button2.dart';
  7. import 'package:fis_ui/simple/select.dart';
  8. class RSingleSelected extends StatefulWidget {
  9. SingleSelected singleSelected;
  10. RSingleSelected(this.singleSelected);
  11. @override
  12. State<StatefulWidget> createState() {
  13. return _RSingleSelectState();
  14. }
  15. }
  16. class _RSingleSelectState extends State<RSingleSelected> {
  17. late SingleSelected singleSelected;
  18. _RSingleSelectState();
  19. String _value = '';
  20. List<String>? _items = [];
  21. SingleSelectedInfo? _singleSelectedInfo;
  22. @override
  23. initState() {
  24. super.initState();
  25. }
  26. @override
  27. Widget build(BuildContext context) {
  28. singleSelected = widget.singleSelected;
  29. final selectInfo = ReportInfo.instance.getElementInfo(singleSelected);
  30. if (selectInfo != null && _singleSelectedInfo != selectInfo) {
  31. _singleSelectedInfo = selectInfo as SingleSelectedInfo;
  32. _singleSelectedInfo!.onSelectedChange.addListener((sender, e) {
  33. if (_singleSelectedInfo!.items!.contains(e)) {
  34. setState(() {
  35. _value = _singleSelectedInfo!.selectedItem;
  36. });
  37. }
  38. });
  39. }
  40. if (singleSelected.items!.isNotEmpty) {
  41. _items = singleSelected.items;
  42. }
  43. if (_items!.isEmpty) {
  44. return const SizedBox();
  45. }
  46. var buttonDecoration = BoxDecoration(
  47. border: Border.all(color: Colors.grey, width: 0.8),
  48. borderRadius: BorderRadius.circular(0),
  49. color: Colors.white,
  50. );
  51. if (_singleSelectedInfo!.selectedItem.isNotEmpty &&
  52. _singleSelectedInfo!.selectedItem != _value) {
  53. _value = _singleSelectedInfo!.selectedItem;
  54. }
  55. return SizedBox(
  56. height: 24,
  57. child: DropdownButtonHideUnderline(
  58. child: DropdownButton2<String>(
  59. dropdownMaxHeight: 280,
  60. buttonWidth: PtToPxConverter.ptToPx(singleSelected.lineWidth),
  61. itemHeight: 28,
  62. itemPadding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2),
  63. isExpanded: false,
  64. dropdownOverButton: false,
  65. scrollbarAlwaysShow: true,
  66. scrollbarThickness: 4,
  67. scrollbarRadius: const Radius.circular(2),
  68. buttonPadding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2),
  69. dropdownDecoration: BoxDecoration(
  70. borderRadius: BorderRadius.circular(4),
  71. ),
  72. buttonDecoration: buttonDecoration,
  73. offset: const Offset(0, -4),
  74. selectedItemHighlightColor: Theme.of(context).secondaryHeaderColor,
  75. selectedItemBuilder: (_) => _items!
  76. .map((e) => _OptionRow(
  77. singleSelected,
  78. e,
  79. height: 22,
  80. ))
  81. .toList(),
  82. value: _value.isEmpty ? null : _value,
  83. items: buildItems(),
  84. onChanged: (v) {
  85. setState(() {
  86. if (_singleSelectedInfo != null) {
  87. _singleSelectedInfo!.selectedItem = v!;
  88. }
  89. _value = v!;
  90. });
  91. },
  92. ),
  93. ),
  94. );
  95. }
  96. List<DropdownMenuItem<String>> buildItems() {
  97. return _items!.map((String e) {
  98. final active = e == _value;
  99. return DropdownMenuItem<String>(
  100. child: _OptionRow(singleSelected, e, isActive: active),
  101. value: e,
  102. );
  103. }).toList();
  104. }
  105. }
  106. class _OptionRow extends StatelessWidget {
  107. _OptionRow(
  108. this.singleSelected,
  109. this.label, {
  110. Key? key,
  111. this.isActive = false,
  112. this.height,
  113. }) : super(key: key);
  114. SingleSelected singleSelected;
  115. final String label;
  116. final bool isActive;
  117. final double? height;
  118. @override
  119. Widget build(BuildContext context) {
  120. final color = singleSelected.fontColor!;
  121. final background = singleSelected.background!;
  122. final text = Text(
  123. label,
  124. style: TextStyle(
  125. backgroundColor: Color.fromARGB(
  126. background.a!, background.r!, background.g!, background.b!),
  127. fontSize: PtToPxConverter.ptToPx(singleSelected.fontSize),
  128. color: Color.fromARGB(color.a!, color.r!, color.g!, color.b!),
  129. ),
  130. );
  131. if (height != null) {
  132. return Container(
  133. alignment: Alignment.centerLeft,
  134. height: height,
  135. child: text,
  136. );
  137. } else {
  138. return text;
  139. }
  140. }
  141. }