WeeklyChallengeCard constructor
WeeklyChallengeCard({
- Key? key,
- required String title,
- required DateTime expiresAt,
- required int currentProgress,
- required int targetProgress,
- required List<
ChallengeMilestone> milestones, - String? subtitle,
- VoidCallback? onTap,
- ValueChanged<
int> ? onClaimMilestone, - VoidCallback? onExpired,
- Color? color,
- double? width,
- double height = 156,
- String? semanticLabel,
Implementation
WeeklyChallengeCard({
super.key,
required this.title,
required this.expiresAt,
required this.currentProgress,
required this.targetProgress,
required this.milestones,
this.subtitle,
this.onTap,
this.onClaimMilestone,
this.onExpired,
this.color,
this.width,
this.height = 156,
this.semanticLabel,
}) {
if (title.trim().isEmpty) {
throw ArgumentError.value(title, 'title', 'must not be empty');
}
if (targetProgress <= 0) {
throw ArgumentError.value(
targetProgress,
'targetProgress',
'must be positive',
);
}
if (currentProgress < 0) {
throw ArgumentError.value(
currentProgress,
'currentProgress',
'must be non-negative',
);
}
if (milestones.isEmpty || milestones.length > 3) {
throw ArgumentError.value(
milestones.length,
'milestones.length',
'must have 1 to 3 milestones',
);
}
var previous = 0;
for (var i = 0; i < milestones.length; i++) {
final milestone = milestones[i];
if (milestone.target <= previous || milestone.target > targetProgress) {
throw ArgumentError.value(
milestone.target,
'milestones[$i].target',
'must be strictly increasing and no greater than targetProgress',
);
}
previous = milestone.target;
}
if (!height.isFinite || height <= 0) {
throw ArgumentError.value(
height,
'height',
'must be finite and positive',
);
}
if (width != null && (!width!.isFinite || width! <= 0)) {
throw ArgumentError.value(width, 'width', 'must be finite and positive');
}
}