combo.dart 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import 'package:fis_measure/interfaces/process/items/item_metas.dart';
  2. import 'package:fis_measure/interfaces/process/items/types.dart';
  3. import 'package:fis_ui/index.dart';
  4. import 'package:fis_ui/interface/interactive_container.dart';
  5. import 'package:flutter/material.dart';
  6. import '../measure_tool.dart';
  7. import 'normal_child.dart';
  8. import 'pisa.dart';
  9. import 'rvsp.dart';
  10. class CustomComboItemGroup extends FStatelessWidget {
  11. static List<String> get specialItemTypes =>
  12. specialItemChildTypes.keys.toList();
  13. static final Map<String, List<String>> specialItemChildTypes = {
  14. MeasureTypes.RVSP: ["Rap"],
  15. MeasureTypes.PISA: ["AlsVel"],
  16. };
  17. final FInteractiveContainer businessParent;
  18. final ItemMeta itemMeta;
  19. final int activeIndex;
  20. final ValueChanged<int> onChildClick;
  21. const CustomComboItemGroup({
  22. super.key,
  23. required this.businessParent,
  24. required this.onChildClick,
  25. required this.itemMeta,
  26. required this.activeIndex,
  27. });
  28. @override
  29. FWidget build(BuildContext context) {
  30. List<FWidget> children = [];
  31. for (var i = 0; i < itemMeta.childItems.length; i++) {
  32. final childItem = itemMeta.childItems[i];
  33. children.add(
  34. NormalChildButton(
  35. businessParent: businessParent,
  36. activeIndex: activeIndex,
  37. index: i,
  38. itemMeta: childItem,
  39. onClick: () {
  40. onChildClick.call(i);
  41. },
  42. ),
  43. );
  44. }
  45. final specialWidgets = _buildSpecialWidgets();
  46. if (specialWidgets != null && specialWidgets.isNotEmpty) {
  47. children.addAll(specialWidgets);
  48. }
  49. return FContainer(
  50. decoration: const BoxDecoration(
  51. color: LeftSiderSelectMeasureState.childContainerBackground,
  52. borderRadius: BorderRadius.only(
  53. bottomLeft: Radius.circular(5), bottomRight: Radius.circular(5)),
  54. ),
  55. padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 5),
  56. child: FColumn(
  57. children: children,
  58. ),
  59. );
  60. }
  61. List<FWidget>? _buildSpecialWidgets() {
  62. final type = itemMeta.measureType;
  63. final childNames = specialItemChildTypes[type];
  64. if (childNames != null) {
  65. return childNames
  66. .map((e) => _SpecialChildItemWidget(typeName: e))
  67. .toList();
  68. }
  69. return null;
  70. }
  71. }
  72. class _SpecialChildItemWidget extends FStatelessWidget {
  73. late final Map<String, FWidgetBuilder> _specialWidgetMap = {
  74. "Rap": buildRap,
  75. "AlsVel": buildAlsVel,
  76. };
  77. final String typeName;
  78. _SpecialChildItemWidget({required this.typeName});
  79. @override
  80. FWidget build(BuildContext context) {
  81. final builder = _specialWidgetMap[typeName]!;
  82. final widget = builder(context);
  83. return widget;
  84. }
  85. FWidget buildRap(BuildContext context) {
  86. return const RapItemButton();
  87. }
  88. FWidget buildAlsVel(BuildContext context) {
  89. return const AlsVelItemButton();
  90. }
  91. }