single_select.dart 4.1 KB

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