exam_check_box.dart 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import 'package:flutter/material.dart';
  2. import 'package:vitalapp/pages/check/models/form.dart';
  3. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_radio_and_select.dart';
  4. import 'package:vitalapp/pages/check/widgets/exam_title.dart';
  5. class ExamCheckBox extends StatelessWidget {
  6. static final _borderRadius = BorderRadius.circular(16.0);
  7. const ExamCheckBox({
  8. super.key,
  9. required this.currentFormObject,
  10. required this.options,
  11. required this.selectCheckBoxChange,
  12. required this.currentSelectedCheckBox,
  13. this.disbaleOthers = false,
  14. });
  15. final FormObject currentFormObject;
  16. final List<Option> options;
  17. final Function selectCheckBoxChange;
  18. final List<dynamic> currentSelectedCheckBox;
  19. /// 禁用其他选项(除已选)
  20. final bool disbaleOthers;
  21. @override
  22. Widget build(BuildContext context) {
  23. String label = currentFormObject.label ?? '';
  24. return ExamCardRadioSelect(
  25. titleText: ExamTitle(
  26. label: label,
  27. titleType: '(多选)',
  28. ),
  29. title: label,
  30. content: Center(
  31. child: Wrap(
  32. children: options
  33. .map(
  34. (e) => _buildItem(context, e),
  35. )
  36. .toList(),
  37. ),
  38. ),
  39. );
  40. }
  41. Widget _buildItem(BuildContext context, Option e) {
  42. Color bgColor;
  43. Color txtColor;
  44. Color borderColor;
  45. if (currentSelectedCheckBox.contains(e.value)) {
  46. // 已选中
  47. final primaryColor = Theme.of(context).primaryColor;
  48. bgColor = primaryColor;
  49. txtColor = Colors.white;
  50. borderColor = primaryColor;
  51. } else {
  52. // 非选中的
  53. if (disbaleOthers) {
  54. // 含有独占选项时
  55. bgColor = Colors.grey.shade400;
  56. txtColor = Colors.white;
  57. borderColor = Colors.grey.shade400;
  58. } else {
  59. // 不含有独占选项时
  60. bgColor = Colors.transparent;
  61. txtColor = Colors.black54;
  62. borderColor = Colors.black26;
  63. }
  64. }
  65. return Container(
  66. padding: const EdgeInsets.all(8),
  67. child: InkWell(
  68. onTap: () => selectCheckBoxChange(e),
  69. borderRadius: _borderRadius,
  70. child: Ink(
  71. decoration: BoxDecoration(
  72. border: Border.all(
  73. color: borderColor,
  74. ),
  75. borderRadius: _borderRadius,
  76. color: bgColor,
  77. ),
  78. child: Container(
  79. padding: const EdgeInsets.all(15),
  80. alignment: Alignment.center,
  81. width: 250,
  82. child: FittedBox(
  83. child: Text(
  84. e.label ?? '',
  85. style: TextStyle(
  86. fontSize: 20,
  87. color: txtColor,
  88. ),
  89. ),
  90. ),
  91. ),
  92. ),
  93. ),
  94. );
  95. }
  96. }