my_checkbox_group.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import 'package:cs_resources/theme/app_colors_theme.dart';
  2. import 'package:flutter/material.dart';
  3. class MyCheckboxGroup extends StatefulWidget {
  4. final List<Map<String, dynamic>> items;
  5. final bool isSingleSelect;
  6. final String nameStr;
  7. final String valueStr;
  8. final ValueChanged<List<Map<String, dynamic>>> onChanged;
  9. final List<Map<String, dynamic>>? defaultSelectedItems;
  10. final TextStyle? labelStyle;
  11. final Color? acviteColor;
  12. final Color? borderSideColor;
  13. MyCheckboxGroup({
  14. required this.items,
  15. this.isSingleSelect = false,
  16. this.valueStr = 'id',
  17. this.nameStr = 'label',
  18. required this.onChanged,
  19. this.defaultSelectedItems,
  20. this.acviteColor = const Color(0xFF4161D0),
  21. this.borderSideColor = const Color(0xFF4161D0),
  22. this.labelStyle = const TextStyle(
  23. fontSize: 14,
  24. fontWeight: FontWeight.w500,
  25. ),
  26. });
  27. @override
  28. _MyCheckboxGroupState createState() => _MyCheckboxGroupState();
  29. }
  30. class _MyCheckboxGroupState extends State<MyCheckboxGroup> {
  31. Set<String> _selectedItemKeys = {};
  32. @override
  33. void initState() {
  34. super.initState();
  35. if (widget.defaultSelectedItems != null) {
  36. _selectedItemKeys.addAll(widget.defaultSelectedItems!.map((item) => item[widget.valueStr] as String));
  37. widget.onChanged(widget.items.where((item) => _selectedItemKeys.contains(item[widget.valueStr] as String)).toList());
  38. }
  39. }
  40. void _toggleSelection(String key) {
  41. if (widget.isSingleSelect) {
  42. setState(() {
  43. _selectedItemKeys.clear();
  44. _selectedItemKeys.add(key);
  45. });
  46. } else {
  47. setState(() {
  48. if (_selectedItemKeys.contains(key)) {
  49. _selectedItemKeys.remove(key);
  50. } else {
  51. _selectedItemKeys.add(key);
  52. }
  53. });
  54. }
  55. widget.onChanged(widget.items.where((item) => _selectedItemKeys.contains(item[widget.valueStr] as String)).toList());
  56. }
  57. @override
  58. Widget build(BuildContext context) {
  59. return Column(
  60. children: widget.items.map((item) {
  61. final key = item[widget.valueStr] as String;
  62. final label = item[widget.nameStr] as String;
  63. return Container(
  64. child: Row(
  65. children: [
  66. Checkbox(
  67. activeColor: widget.acviteColor ?? context.appColors.textPrimary,
  68. side: BorderSide(
  69. color: widget.borderSideColor ?? context.appColors.textPrimary,
  70. ),
  71. value: _selectedItemKeys.contains(key),
  72. onChanged: (bool? checked) {
  73. if (checked != null) {
  74. _toggleSelection(key);
  75. }
  76. },
  77. ),
  78. Text(
  79. label,
  80. style: widget.labelStyle ?? const TextStyle(
  81. fontSize: 14,
  82. fontWeight: FontWeight.w500,
  83. ),
  84. ),
  85. ],
  86. ),
  87. );
  88. }).toList(),
  89. );
  90. }
  91. }