single_select.dart 4.1 KB

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