custom_radio_check.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import 'package:cs_resources/constants/color_constants.dart';
  2. import 'package:cs_resources/generated/assets.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:get/get_utils/get_utils.dart';
  5. import 'package:get/get_utils/src/extensions/widget_extensions.dart';
  6. import 'package:widgets/ext/ex_widget.dart';
  7. import 'package:widgets/my_load_image.dart';
  8. import 'package:widgets/my_text_view.dart';
  9. /**
  10. * 条件单选 Radio
  11. */
  12. class CustomRadioCheck extends StatefulWidget {
  13. final List<String> options;
  14. int? selectedPosition;
  15. final Function(int index, String text) onOptionSelected;
  16. final bool enable;
  17. CustomRadioCheck({
  18. required this.options,
  19. required this.onOptionSelected,
  20. this.selectedPosition = 0,
  21. this.enable = true, // 默认可用
  22. });
  23. @override
  24. _CustomRadioCheckState createState() => _CustomRadioCheckState();
  25. }
  26. class _CustomRadioCheckState extends State<CustomRadioCheck> {
  27. String? _selectedOption;
  28. @override
  29. void initState() {
  30. super.initState();
  31. _initializeSelectedOption();
  32. }
  33. void _initializeSelectedOption() {
  34. if (widget.selectedPosition != null && widget.selectedPosition! >= 0 && widget.selectedPosition! < widget.options.length) {
  35. _selectedOption = widget.options[widget.selectedPosition!];
  36. } else {
  37. _selectedOption = widget.options.isNotEmpty ? widget.options[0] : null;
  38. }
  39. }
  40. @override
  41. void didUpdateWidget(CustomRadioCheck oldWidget) {
  42. super.didUpdateWidget(oldWidget);
  43. // 如果 selectedPosition 发生变化,重新初始化选中项
  44. if (oldWidget.selectedPosition != widget.selectedPosition) {
  45. _initializeSelectedOption();
  46. }
  47. }
  48. @override
  49. Widget build(BuildContext context) {
  50. return Wrap(
  51. spacing: 8.0,
  52. runSpacing: 8.0,
  53. children: widget.options.map((option) {
  54. return _buildRadioWithIconAndText(
  55. path: option == _selectedOption ? Assets.cptAuthLoginRadioChecked : Assets.cptAuthLoginRadioUncheck,
  56. text: option,
  57. value: option == _selectedOption,
  58. onChanged: widget.enable ? (value) { // 只在可用状态下响应点击
  59. setState(() {
  60. _selectedOption = option;
  61. int selectedIndex = widget.options.indexOf(option);
  62. widget.onOptionSelected(selectedIndex, option);
  63. });
  64. } : null, // 如果不可用则不设置回调
  65. );
  66. }).toList(),
  67. );
  68. }
  69. Widget _buildRadioWithIconAndText({
  70. required String path,
  71. required String text,
  72. required bool value,
  73. required Function(bool)? onChanged, // 允许 onChanged 为 null
  74. }) {
  75. return Row(
  76. mainAxisSize: MainAxisSize.min,
  77. children: <Widget>[
  78. MyAssetImage(path, width: 22, height: 22),
  79. SizedBox(width: 10),
  80. MyTextView(
  81. text.tr,
  82. textColor: widget.enable ? ColorConstants.white : ColorConstants.gray, // 根据 enable 改变文本颜色
  83. fontSize: 14,
  84. isFontRegular: true,
  85. ),
  86. ],
  87. ).marginOnly(right: 20, bottom: 5).onTap(() {
  88. if (onChanged != null) { // 只有在可用状态下才触发
  89. onChanged(true);
  90. }
  91. });
  92. }
  93. }