select_message_reminder_date_dialog.dart 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_screenutil/flutter_screenutil.dart';
  4. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  5. import 'package:location/resource/assets.gen.dart';
  6. import 'package:location/resource/string.gen.dart';
  7. import 'package:location/utils/common_expand.dart';
  8. import '../resource/colors.gen.dart';
  9. class SelectMessageReminderDateDialog {
  10. static const String _tag = 'SelectMessageReminderDateDialog';
  11. static void show(
  12. {List<int>? selectWeekDays, void Function(List<int>)? onSelected}) {
  13. SmartDialog.show(
  14. tag: _tag,
  15. animationType: SmartAnimationType.centerFade_otherSlide,
  16. alignment: Alignment.bottomCenter,
  17. keepSingle: true,
  18. builder: (_) {
  19. return SelectMessageReminderDateView(selectWeekDays, onSelected);
  20. });
  21. }
  22. static void hide() {
  23. SmartDialog.dismiss(tag: _tag);
  24. }
  25. static String convertString(List<int> weekDays) {
  26. //如果weekDays = 7天则返回每天
  27. if (weekDays.length == 7) {
  28. return '每天';
  29. }
  30. //如果不是则返回周一/周三/周四/周五/周六/周日 这样
  31. List<String> dayNames = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
  32. List<String> selectedDayNames = [];
  33. for (var day in weekDays) {
  34. if (day >= 1 && day <= 7) {
  35. selectedDayNames.add(dayNames[day - 1]);
  36. }
  37. }
  38. return selectedDayNames.join('/');
  39. }
  40. }
  41. class SelectMessageReminderDateView extends StatefulWidget {
  42. final List<int>? selectWeekDays;
  43. final void Function(List<int>)? onSelected;
  44. const SelectMessageReminderDateView(this.selectWeekDays, this.onSelected,
  45. {super.key});
  46. @override
  47. State<SelectMessageReminderDateView> createState() =>
  48. _SelectMessageReminderDateViewState();
  49. }
  50. class _SelectMessageReminderDateViewState
  51. extends State<SelectMessageReminderDateView> {
  52. late List<int> _selectedWeekDays;
  53. @override
  54. void initState() {
  55. super.initState();
  56. // 传入的1=周一, 2=周二, ..., 7=周日,内部用0=周日, 1=周一...
  57. if (widget.selectWeekDays != null) {
  58. _selectedWeekDays = widget.selectWeekDays!
  59. .where((d) => d >= 1 && d <= 7)
  60. .map((d) => d % 7) // 1=>1, 2=>2, ..., 7=>0
  61. .toList();
  62. } else {
  63. _selectedWeekDays = [];
  64. }
  65. }
  66. @override
  67. Widget build(BuildContext context) {
  68. return IntrinsicHeight(
  69. child: Container(
  70. padding: EdgeInsets.all(16.w),
  71. margin: EdgeInsets.all(12.w),
  72. width: double.infinity,
  73. decoration: BoxDecoration(
  74. borderRadius: BorderRadius.circular(16.r),
  75. gradient: LinearGradient(
  76. begin: Alignment.topCenter,
  77. end: Alignment.bottomCenter,
  78. colors: ['#E4E4FF'.color, ColorName.white],
  79. stops: [0.0, 0.3])),
  80. child: Column(
  81. crossAxisAlignment: CrossAxisAlignment.start,
  82. children: [
  83. Text(StringName.selectMessageReminderDateTitle,
  84. style: TextStyle(
  85. fontSize: 16.sp,
  86. color: ColorName.black90,
  87. fontWeight: FontWeight.bold)),
  88. SizedBox(height: 12.w),
  89. buildDateView(),
  90. SizedBox(height: 12.w),
  91. buildSelectBtnView(),
  92. ],
  93. ),
  94. ),
  95. );
  96. }
  97. Widget buildDateView() {
  98. return WeekdaySelector(
  99. initialSelected: _selectedWeekDays,
  100. onChanged: (selected) {
  101. setState(() {
  102. _selectedWeekDays = selected;
  103. });
  104. },
  105. );
  106. }
  107. Widget buildSelectBtnView() {
  108. return Row(
  109. children: [
  110. Expanded(
  111. child: GestureDetector(
  112. onTap: () {
  113. SelectMessageReminderDateDialog.hide();
  114. },
  115. child: Container(
  116. height: 46.w,
  117. decoration: BoxDecoration(
  118. color: ColorName.colorPrimary.withOpacity(0.08),
  119. borderRadius: BorderRadius.circular(100.w)),
  120. child: Center(
  121. child: Text(
  122. StringName.dialogCancel,
  123. style: TextStyle(
  124. fontSize: 14.sp,
  125. color: ColorName.colorPrimary,
  126. fontWeight: FontWeight.bold),
  127. ),
  128. ),
  129. ),
  130. )),
  131. SizedBox(width: 12.w),
  132. Expanded(
  133. child: GestureDetector(
  134. onTap: onSureClick,
  135. child: Container(
  136. height: 46.w,
  137. decoration: BoxDecoration(
  138. color: ColorName.colorPrimary,
  139. borderRadius: BorderRadius.circular(100.w)),
  140. child: Center(
  141. child: Text(
  142. StringName.dialogSave,
  143. style: TextStyle(
  144. fontSize: 14.sp,
  145. color: ColorName.white,
  146. fontWeight: FontWeight.bold),
  147. ),
  148. ),
  149. ),
  150. )),
  151. ],
  152. );
  153. }
  154. void onSureClick() {
  155. // 返回时将0=周日, 1=周一... 转换为1=周一, ..., 7=周日 并将7放到最后
  156. List<int> result = _selectedWeekDays.map((d) => d == 0 ? 7 : d).toList();
  157. result.sort((a, b) {
  158. if (a == 7 && b != 7) return 1;
  159. if (a != 7 && b == 7) return -1;
  160. return a.compareTo(b);
  161. });
  162. widget.onSelected?.call(result);
  163. SelectMessageReminderDateDialog.hide();
  164. }
  165. }
  166. class WeekdaySelector extends StatefulWidget {
  167. final List<int>? initialSelected;
  168. final ValueChanged<List<int>>? onChanged;
  169. const WeekdaySelector({this.initialSelected, this.onChanged, super.key});
  170. @override
  171. _WeekdaySelectorState createState() => _WeekdaySelectorState();
  172. }
  173. class _WeekdaySelectorState extends State<WeekdaySelector> {
  174. final List<String> days = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
  175. late List<bool> selected;
  176. @override
  177. void initState() {
  178. super.initState();
  179. selected = List.filled(7, false);
  180. if (widget.initialSelected != null) {
  181. for (var i in widget.initialSelected!) {
  182. if (i >= 0 && i < 7) selected[i] = true;
  183. }
  184. }
  185. }
  186. @override
  187. Widget build(BuildContext context) {
  188. return Column(
  189. children: List.generate(days.length, (index) {
  190. return Column(
  191. children: [
  192. GestureDetector(
  193. behavior: HitTestBehavior.translucent,
  194. onTap: () {
  195. setState(() {
  196. selected[index] = !selected[index];
  197. widget.onChanged?.call(_getSelectedIndexes());
  198. });
  199. },
  200. child: Container(
  201. padding: EdgeInsets.symmetric(vertical: 12.w),
  202. child: Row(
  203. children: [
  204. Text(days[index],
  205. style: TextStyle(
  206. fontSize: 14.sp, color: ColorName.black60)),
  207. Spacer(),
  208. if (selected[index])
  209. Assets.images.iconDateSelected
  210. .image(width: 18.w, height: 18.w)
  211. else
  212. Assets.images.iconDateUnSelect
  213. .image(width: 18.w, height: 18.w)
  214. ],
  215. ),
  216. ),
  217. ),
  218. if (index != days.length - 1)
  219. Container(
  220. height: 0.5.w,
  221. width: double.infinity,
  222. color: '#14000000'.color)
  223. ],
  224. );
  225. }),
  226. );
  227. }
  228. List<int> _getSelectedIndexes() {
  229. List<int> result = [];
  230. for (int i = 0; i < selected.length; i++) {
  231. if (selected[i]) result.add(i);
  232. }
  233. return result;
  234. }
  235. }