2024-05-18 09:37:50 +08:00

138 lines
4.7 KiB
Dart
Executable File

part of 'widget.dart';
class WeekView extends StatelessWidget {
WeekView({
Key? key,
required this.dates,
required this.selectedDate,
required this.lineHeight,
this.highlightMonth,
this.onChanged,
this.events,
required this.innerDot,
required this.keepLineSize,
this.textStyle,
}) : super(key: key);
final DateTime todayDate = DateTime.now().toZeroTime();
final List<DateTime> dates;
final double lineHeight;
final int? highlightMonth;
final DateTime selectedDate;
final ValueChanged<DateTime>? onChanged;
final List<DateTime>? events;
final bool innerDot;
final bool keepLineSize;
final TextStyle? textStyle;
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return SizedBox(
height: lineHeight,
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: List<Widget>.generate(
7,
(dayIndex) {
final date = dates[dayIndex];
final isToday = date.isAtSameMomentAs(todayDate);
final isSelected = date.isAtSameMomentAs(selectedDate);
final isHighlight = highlightMonth == date.month;
final hasEvent =
events!.indexWhere((element) => element.isSameDate(date));
if (keepLineSize) {
return InkResponse(
onTap: onChanged != null ? () => onChanged!(date) : null,
child: Container(
height: 36,
width: 36,
decoration: BoxDecoration(
color: isSelected
? theme.primaryColor
: isToday
? theme.highlightColor
: null,
borderRadius: BorderRadius.circular(18),
shape: BoxShape.rectangle,
),
child: Column(
children: [
Text(
'${date.day}',
style: textStyle?.copyWith(
color: isSelected || isToday
? theme.colorScheme.onPrimary
: isHighlight || highlightMonth == null
? null
: theme.disabledColor,
fontWeight:
isSelected && textStyle?.fontWeight != null
? FontWeight
.values[textStyle!.fontWeight!.index + 2]
: textStyle?.fontWeight,
),
),
if (!hasEvent.isNegative)
Container(
height: 4,
width: 4,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(50),
color: isSelected
? theme.colorScheme.onPrimary
: theme.colorScheme.secondary,
),
)
],
),
),
);
}
return Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
DateBox(
width: innerDot ? 32 : 24,
height: innerDot ? 32 : 24,
showDot: innerDot,
onPressed: onChanged != null ? () => onChanged!(date) : null,
isSelected: isSelected,
isToday: isToday,
hasEvent: !hasEvent.isNegative,
child: Text(
'${date.day}',
maxLines: 1,
style: TextStyle(
color: isSelected || isToday
? theme.colorScheme.onPrimary
: isHighlight || highlightMonth == null
? null
: theme.disabledColor,
),
),
),
if (!innerDot && !hasEvent.isNegative)
Container(
height: 6,
width: 6,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(50),
color: theme.primaryColor,
),
)
],
);
},
growable: false,
),
),
);
}
}