import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:location/resource/assets.gen.dart'; import 'package:location/resource/string.gen.dart'; import 'package:location/utils/common_expand.dart'; import '../resource/colors.gen.dart'; class SelectMessageReminderDateDialog { static const String _tag = 'SelectMessageReminderDateDialog'; static void show( {List? selectWeekDays, void Function(List)? onSelected}) { SmartDialog.show( tag: _tag, animationType: SmartAnimationType.centerFade_otherSlide, alignment: Alignment.bottomCenter, keepSingle: true, builder: (_) { return SelectMessageReminderDateView(selectWeekDays, onSelected); }); } static void hide() { SmartDialog.dismiss(tag: _tag); } static String convertString(List weekDays) { //如果weekDays = 7天则返回每天 if (weekDays.length == 7) { return '每天'; } //如果不是则返回周一/周三/周四/周五/周六/周日 这样 List dayNames = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']; List selectedDayNames = []; for (var day in weekDays) { if (day >= 1 && day <= 7) { selectedDayNames.add(dayNames[day - 1]); } } return selectedDayNames.join('/'); } } class SelectMessageReminderDateView extends StatefulWidget { final List? selectWeekDays; final void Function(List)? onSelected; const SelectMessageReminderDateView(this.selectWeekDays, this.onSelected, {super.key}); @override State createState() => _SelectMessageReminderDateViewState(); } class _SelectMessageReminderDateViewState extends State { late List _selectedWeekDays; @override void initState() { super.initState(); // 传入的1=周一, 2=周二, ..., 7=周日,内部用0=周日, 1=周一... if (widget.selectWeekDays != null) { _selectedWeekDays = widget.selectWeekDays! .where((d) => d >= 1 && d <= 7) .map((d) => d % 7) // 1=>1, 2=>2, ..., 7=>0 .toList(); } else { _selectedWeekDays = []; } } @override Widget build(BuildContext context) { return IntrinsicHeight( child: Container( padding: EdgeInsets.all(16.w), margin: EdgeInsets.all(12.w), width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(16.r), gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: ['#E4E4FF'.color, ColorName.white], stops: [0.0, 0.3])), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(StringName.selectMessageReminderDateTitle, style: TextStyle( fontSize: 16.sp, color: ColorName.black90, fontWeight: FontWeight.bold)), SizedBox(height: 12.w), buildDateView(), SizedBox(height: 12.w), buildSelectBtnView(), ], ), ), ); } Widget buildDateView() { return WeekdaySelector( initialSelected: _selectedWeekDays, onChanged: (selected) { setState(() { _selectedWeekDays = selected; }); }, ); } Widget buildSelectBtnView() { return Row( children: [ Expanded( child: GestureDetector( onTap: () { SelectMessageReminderDateDialog.hide(); }, child: Container( height: 46.w, decoration: BoxDecoration( color: ColorName.colorPrimary.withOpacity(0.08), borderRadius: BorderRadius.circular(100.w)), child: Center( child: Text( StringName.dialogCancel, style: TextStyle( fontSize: 14.sp, color: ColorName.colorPrimary, fontWeight: FontWeight.bold), ), ), ), )), SizedBox(width: 12.w), Expanded( child: GestureDetector( onTap: onSureClick, child: Container( height: 46.w, decoration: BoxDecoration( color: ColorName.colorPrimary, borderRadius: BorderRadius.circular(100.w)), child: Center( child: Text( StringName.dialogSave, style: TextStyle( fontSize: 14.sp, color: ColorName.white, fontWeight: FontWeight.bold), ), ), ), )), ], ); } void onSureClick() { // 返回时将0=周日, 1=周一... 转换为1=周一, ..., 7=周日 并将7放到最后 List result = _selectedWeekDays.map((d) => d == 0 ? 7 : d).toList(); result.sort((a, b) { if (a == 7 && b != 7) return 1; if (a != 7 && b == 7) return -1; return a.compareTo(b); }); widget.onSelected?.call(result); SelectMessageReminderDateDialog.hide(); } } class WeekdaySelector extends StatefulWidget { final List? initialSelected; final ValueChanged>? onChanged; const WeekdaySelector({this.initialSelected, this.onChanged, super.key}); @override _WeekdaySelectorState createState() => _WeekdaySelectorState(); } class _WeekdaySelectorState extends State { final List days = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]; late List selected; @override void initState() { super.initState(); selected = List.filled(7, false); if (widget.initialSelected != null) { for (var i in widget.initialSelected!) { if (i >= 0 && i < 7) selected[i] = true; } } } @override Widget build(BuildContext context) { return Column( children: List.generate(days.length, (index) { return Column( children: [ GestureDetector( behavior: HitTestBehavior.translucent, onTap: () { setState(() { selected[index] = !selected[index]; widget.onChanged?.call(_getSelectedIndexes()); }); }, child: Container( padding: EdgeInsets.symmetric(vertical: 12.w), child: Row( children: [ Text(days[index], style: TextStyle( fontSize: 14.sp, color: ColorName.black60)), Spacer(), if (selected[index]) Assets.images.iconDateSelected .image(width: 18.w, height: 18.w) else Assets.images.iconDateUnSelect .image(width: 18.w, height: 18.w) ], ), ), ), if (index != days.length - 1) Container( height: 0.5.w, width: double.infinity, color: '#14000000'.color) ], ); }), ); } List _getSelectedIndexes() { List result = []; for (int i = 0; i < selected.length; i++) { if (selected[i]) result.add(i); } return result; } }