custom_radio_check.dart 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. CustomRadioCheck({
  17. required this.options,
  18. required this.onOptionSelected,
  19. this.selectedPosition = 0,
  20. });
  21. @override
  22. _CustomRadioCheckState createState() => _CustomRadioCheckState();
  23. }
  24. class _CustomRadioCheckState extends State<CustomRadioCheck> {
  25. String? _selectedOption;
  26. @override
  27. void initState() {
  28. super.initState();
  29. _initializeSelectedOption();
  30. }
  31. void _initializeSelectedOption() {
  32. if (widget.selectedPosition != null && widget.selectedPosition! >= 0 && widget.selectedPosition! < widget.options.length) {
  33. _selectedOption = widget.options[widget.selectedPosition!];
  34. } else {
  35. _selectedOption = widget.options.isNotEmpty ? widget.options[0] : null;
  36. }
  37. }
  38. @override
  39. void didUpdateWidget(CustomRadioCheck oldWidget) {
  40. super.didUpdateWidget(oldWidget);
  41. // 如果 selectedPosition 发生变化,重新初始化选中项
  42. if (oldWidget.selectedPosition != widget.selectedPosition) {
  43. _initializeSelectedOption();
  44. }
  45. }
  46. @override
  47. Widget build(BuildContext context) {
  48. return Wrap(
  49. spacing: 8.0,
  50. runSpacing: 8.0,
  51. children: widget.options.map((option) {
  52. return _buildRadioWithIconAndText(
  53. path: option == _selectedOption ? Assets.cptAuthLoginRadioChecked : Assets.cptAuthLoginRadioUncheck,
  54. text: option,
  55. value: option == _selectedOption,
  56. onChanged: (value) {
  57. setState(() {
  58. _selectedOption = option;
  59. int selectedIndex = widget.options.indexOf(option);
  60. widget.onOptionSelected(selectedIndex, option);
  61. });
  62. },
  63. );
  64. }).toList(),
  65. );
  66. }
  67. Widget _buildRadioWithIconAndText({
  68. required String path,
  69. required String text,
  70. required bool value,
  71. required Function(bool) onChanged,
  72. }) {
  73. return Row(
  74. mainAxisSize: MainAxisSize.min,
  75. children: <Widget>[
  76. MyAssetImage(path, width: 22, height: 22),
  77. SizedBox(width: 10),
  78. MyTextView(
  79. text.tr,
  80. textColor: ColorConstants.white,
  81. fontSize: 14,
  82. isFontRegular: true,
  83. ),
  84. ],
  85. ).marginOnly(right: 20, bottom: 5).onTap(() {
  86. onChanged(true);
  87. });
  88. }
  89. }