| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- 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<int>? selectWeekDays, void Function(List<int>)? 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<int> weekDays) {
- //如果weekDays = 7天则返回每天
- if (weekDays.length == 7) {
- return '每天';
- }
- //如果不是则返回周一/周三/周四/周五/周六/周日 这样
- List<String> dayNames = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
- List<String> 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<int>? selectWeekDays;
- final void Function(List<int>)? onSelected;
- const SelectMessageReminderDateView(this.selectWeekDays, this.onSelected,
- {super.key});
- @override
- State<SelectMessageReminderDateView> createState() =>
- _SelectMessageReminderDateViewState();
- }
- class _SelectMessageReminderDateViewState
- extends State<SelectMessageReminderDateView> {
- late List<int> _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<int> 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<int>? initialSelected;
- final ValueChanged<List<int>>? onChanged;
- const WeekdaySelector({this.initialSelected, this.onChanged, super.key});
- @override
- _WeekdaySelectorState createState() => _WeekdaySelectorState();
- }
- class _WeekdaySelectorState extends State<WeekdaySelector> {
- final List<String> days = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
- late List<bool> 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<int> _getSelectedIndexes() {
- List<int> result = [];
- for (int i = 0; i < selected.length; i++) {
- if (selected[i]) result.add(i);
- }
- return result;
- }
- }
|