single_select.dart 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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. }
  33. if (singleSelected.items!.isNotEmpty) {
  34. _items = singleSelected.items;
  35. }
  36. if (_items!.isEmpty) {
  37. return const SizedBox();
  38. }
  39. var buttonDecoration = BoxDecoration(
  40. border: Border.all(color: Colors.grey, width: 0.8),
  41. // border: Border.all(color: Colors.grey[200]!, width: 0.5),
  42. borderRadius: BorderRadius.circular(0),
  43. color: Colors.white,
  44. );
  45. if (_singleSelectedInfo!.selectedItem.isNotEmpty &&
  46. _singleSelectedInfo!.selectedItem != _value) {
  47. _value = _singleSelectedInfo!.selectedItem;
  48. }
  49. return SizedBox(
  50. height: 24,
  51. child: DropdownButtonHideUnderline(
  52. child: DropdownButton2<String>(
  53. dropdownMaxHeight: 280,
  54. buttonWidth: PtToPxConverter.ptToPx(singleSelected.lineWidth),
  55. itemHeight: 28,
  56. itemPadding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2),
  57. isExpanded: false,
  58. dropdownOverButton: false,
  59. scrollbarAlwaysShow: true,
  60. scrollbarThickness: 4,
  61. scrollbarRadius: const Radius.circular(2),
  62. buttonPadding: const EdgeInsets.symmetric(horizontal: 4, vertical: 2),
  63. dropdownDecoration: BoxDecoration(
  64. borderRadius: BorderRadius.circular(4),
  65. ),
  66. buttonDecoration: buttonDecoration,
  67. offset: const Offset(0, -4),
  68. selectedItemHighlightColor: Theme.of(context).secondaryHeaderColor,
  69. selectedItemBuilder: (_) => _items!
  70. .map((e) => _OptionRow(
  71. singleSelected,
  72. e,
  73. height: 22,
  74. ))
  75. .toList(),
  76. value: _value.isEmpty ? null : _value,
  77. items: buildItems(),
  78. onChanged: (v) {
  79. setState(() {
  80. if (_singleSelectedInfo != null) {
  81. _singleSelectedInfo!.selectedItem = v!;
  82. }
  83. _value = v!;
  84. });
  85. },
  86. ),
  87. ),
  88. );
  89. }
  90. List<DropdownMenuItem<String>> buildItems() {
  91. return _items!.map((String e) {
  92. final active = e == _value;
  93. return DropdownMenuItem<String>(
  94. child: _OptionRow(singleSelected, e, isActive: active),
  95. value: e,
  96. );
  97. }).toList();
  98. }
  99. }
  100. class _OptionRow extends StatelessWidget {
  101. _OptionRow(
  102. this.singleSelected,
  103. this.label, {
  104. Key? key,
  105. this.isActive = false,
  106. this.height,
  107. }) : super(key: key);
  108. SingleSelected singleSelected;
  109. final String label;
  110. final bool isActive;
  111. final double? height;
  112. @override
  113. Widget build(BuildContext context) {
  114. final color = singleSelected.fontColor!;
  115. final background = singleSelected.background!;
  116. final text = Text(
  117. label,
  118. style: TextStyle(
  119. backgroundColor: Color.fromARGB(
  120. background.a!, background.r!, background.g!, background.b!),
  121. fontSize: PtToPxConverter.ptToPx(singleSelected.fontSize),
  122. color: Color.fromARGB(color.a!, color.r!, color.g!, color.b!),
  123. ),
  124. );
  125. if (height != null) {
  126. return Container(
  127. alignment: Alignment.centerLeft,
  128. height: height,
  129. child: text,
  130. );
  131. } else {
  132. return text;
  133. }
  134. }
  135. }