|
@@ -18,7 +18,7 @@ class ChallengeListScreen extends ConsumerWidget {
|
|
|
actions: [
|
|
actions: [
|
|
|
IconButton(
|
|
IconButton(
|
|
|
icon: const Icon(Icons.refresh),
|
|
icon: const Icon(Icons.refresh),
|
|
|
- onPressed: () => ref.refresh(challengeListProvider.future),
|
|
|
|
|
|
|
+ onPressed: () => ref.read(challengeListProvider.notifier).refresh(),
|
|
|
),
|
|
),
|
|
|
],
|
|
],
|
|
|
),
|
|
),
|
|
@@ -42,7 +42,8 @@ class ChallengeListScreen extends ConsumerWidget {
|
|
|
Text('加载失败: $error', style: const TextStyle(color: Colors.red)),
|
|
Text('加载失败: $error', style: const TextStyle(color: Colors.red)),
|
|
|
const SizedBox(height: 16),
|
|
const SizedBox(height: 16),
|
|
|
ElevatedButton(
|
|
ElevatedButton(
|
|
|
- onPressed: () => ref.refresh(challengeListProvider.future),
|
|
|
|
|
|
|
+ onPressed: () =>
|
|
|
|
|
+ ref.read(challengeListProvider.notifier).refresh(),
|
|
|
child: const Text('重试'),
|
|
child: const Text('重试'),
|
|
|
),
|
|
),
|
|
|
],
|
|
],
|
|
@@ -51,24 +52,29 @@ class ChallengeListScreen extends ConsumerWidget {
|
|
|
data: (challenges) => challenges.isEmpty
|
|
data: (challenges) => challenges.isEmpty
|
|
|
? const Center(child: Text('暂无挑战', style: TextStyle(fontSize: 18)))
|
|
? const Center(child: Text('暂无挑战', style: TextStyle(fontSize: 18)))
|
|
|
: RefreshIndicator(
|
|
: RefreshIndicator(
|
|
|
- onRefresh: () => ref.read(challengeListProvider.notifier).refresh(),
|
|
|
|
|
|
|
+ onRefresh: () =>
|
|
|
|
|
+ ref.read(challengeListProvider.notifier).refresh(),
|
|
|
child: ListView.builder(
|
|
child: ListView.builder(
|
|
|
padding: const EdgeInsets.all(16),
|
|
padding: const EdgeInsets.all(16),
|
|
|
itemCount: challenges.length,
|
|
itemCount: challenges.length,
|
|
|
- itemBuilder: (_, index) => ChallengeCard(challenge: challenges[index]),
|
|
|
|
|
|
|
+ // itemBuilder: (_, index) => ChallengeCard(challenge: challenges[index]),
|
|
|
|
|
+ itemBuilder: (context, index) => ListTile(
|
|
|
|
|
+ title: Text(challenges[index].title),
|
|
|
|
|
+ // 其他列表项内容
|
|
|
|
|
+ ),
|
|
|
),
|
|
),
|
|
|
),
|
|
),
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-class ChallengeCard extends ConsumerWidget {
|
|
|
|
|
|
|
+class ChallengeCard extends StatelessWidget {
|
|
|
final ChallengeModel challenge;
|
|
final ChallengeModel challenge;
|
|
|
|
|
|
|
|
const ChallengeCard({super.key, required this.challenge});
|
|
const ChallengeCard({super.key, required this.challenge});
|
|
|
|
|
|
|
|
@override
|
|
@override
|
|
|
- Widget build(BuildContext context, WidgetRef ref) {
|
|
|
|
|
|
|
+ Widget build(BuildContext context) {
|
|
|
final theme = Theme.of(context);
|
|
final theme = Theme.of(context);
|
|
|
|
|
|
|
|
return Card(
|
|
return Card(
|
|
@@ -85,7 +91,10 @@ class ChallengeCard extends ConsumerWidget {
|
|
|
Expanded(
|
|
Expanded(
|
|
|
child: Text(
|
|
child: Text(
|
|
|
challenge.title,
|
|
challenge.title,
|
|
|
- style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
|
|
|
|
|
|
|
+ style: const TextStyle(
|
|
|
|
|
+ fontSize: 18,
|
|
|
|
|
+ fontWeight: FontWeight.bold,
|
|
|
|
|
+ ),
|
|
|
),
|
|
),
|
|
|
),
|
|
),
|
|
|
_DifficultyChip(difficulty: challenge.difficulty),
|
|
_DifficultyChip(difficulty: challenge.difficulty),
|
|
@@ -117,15 +126,19 @@ class ChallengeCard extends ConsumerWidget {
|
|
|
// 将复杂子组件拆分为独立组件
|
|
// 将复杂子组件拆分为独立组件
|
|
|
class _DifficultyChip extends StatelessWidget {
|
|
class _DifficultyChip extends StatelessWidget {
|
|
|
final String difficulty;
|
|
final String difficulty;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
const _DifficultyChip({required this.difficulty});
|
|
const _DifficultyChip({required this.difficulty});
|
|
|
|
|
|
|
|
Color _getColor() {
|
|
Color _getColor() {
|
|
|
switch (difficulty) {
|
|
switch (difficulty) {
|
|
|
- case '简单': return Colors.green;
|
|
|
|
|
- case '中等': return Colors.orange;
|
|
|
|
|
- case '困难': return Colors.red;
|
|
|
|
|
- default: return Colors.grey;
|
|
|
|
|
|
|
+ case '简单':
|
|
|
|
|
+ return Colors.green;
|
|
|
|
|
+ case '中等':
|
|
|
|
|
+ return Colors.orange;
|
|
|
|
|
+ case '困难':
|
|
|
|
|
+ return Colors.red;
|
|
|
|
|
+ default:
|
|
|
|
|
+ return Colors.grey;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -142,7 +155,7 @@ class _ProgressBar extends StatelessWidget {
|
|
|
final DateTime startDate;
|
|
final DateTime startDate;
|
|
|
final DateTime endDate;
|
|
final DateTime endDate;
|
|
|
final int remainingDays;
|
|
final int remainingDays;
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
const _ProgressBar({
|
|
const _ProgressBar({
|
|
|
required this.startDate,
|
|
required this.startDate,
|
|
|
required this.endDate,
|
|
required this.endDate,
|
|
@@ -159,7 +172,10 @@ class _ProgressBar extends StatelessWidget {
|
|
|
return Column(
|
|
return Column(
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
children: [
|
|
children: [
|
|
|
- Text('${(progress * 100).toStringAsFixed(0)}%', style: const TextStyle(fontSize: 12)),
|
|
|
|
|
|
|
+ Text(
|
|
|
|
|
+ '${(progress * 100).toStringAsFixed(0)}%',
|
|
|
|
|
+ style: const TextStyle(fontSize: 12),
|
|
|
|
|
+ ),
|
|
|
const SizedBox(height: 4),
|
|
const SizedBox(height: 4),
|
|
|
LinearProgressIndicator(
|
|
LinearProgressIndicator(
|
|
|
value: progress,
|
|
value: progress,
|
|
@@ -172,8 +188,14 @@ class _ProgressBar extends StatelessWidget {
|
|
|
Row(
|
|
Row(
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
children: [
|
|
children: [
|
|
|
- Text(DateFormat('MM/dd').format(startDate), style: const TextStyle(fontSize: 12)),
|
|
|
|
|
- Text(DateFormat('MM/dd').format(endDate), style: const TextStyle(fontSize: 12)),
|
|
|
|
|
|
|
+ Text(
|
|
|
|
|
+ DateFormat('MM/dd').format(startDate),
|
|
|
|
|
+ style: const TextStyle(fontSize: 12),
|
|
|
|
|
+ ),
|
|
|
|
|
+ Text(
|
|
|
|
|
+ DateFormat('MM/dd').format(endDate),
|
|
|
|
|
+ style: const TextStyle(fontSize: 12),
|
|
|
|
|
+ ),
|
|
|
],
|
|
],
|
|
|
),
|
|
),
|
|
|
],
|
|
],
|
|
@@ -184,11 +206,8 @@ class _ProgressBar extends StatelessWidget {
|
|
|
class _CardFooter extends StatelessWidget {
|
|
class _CardFooter extends StatelessWidget {
|
|
|
final int participants;
|
|
final int participants;
|
|
|
final int remainingDays;
|
|
final int remainingDays;
|
|
|
-
|
|
|
|
|
- const _CardFooter({
|
|
|
|
|
- required this.participants,
|
|
|
|
|
- required this.remainingDays,
|
|
|
|
|
- });
|
|
|
|
|
|
|
+
|
|
|
|
|
+ const _CardFooter({required this.participants, required this.remainingDays});
|
|
|
|
|
|
|
|
@override
|
|
@override
|
|
|
Widget build(BuildContext context) {
|
|
Widget build(BuildContext context) {
|
|
@@ -205,11 +224,8 @@ class _CardFooter extends StatelessWidget {
|
|
|
class _InfoChip extends StatelessWidget {
|
|
class _InfoChip extends StatelessWidget {
|
|
|
final IconData icon;
|
|
final IconData icon;
|
|
|
final String text;
|
|
final String text;
|
|
|
-
|
|
|
|
|
- const _InfoChip({
|
|
|
|
|
- required this.icon,
|
|
|
|
|
- required this.text,
|
|
|
|
|
- });
|
|
|
|
|
|
|
+
|
|
|
|
|
+ const _InfoChip({required this.icon, required this.text});
|
|
|
|
|
|
|
|
@override
|
|
@override
|
|
|
Widget build(BuildContext context) {
|
|
Widget build(BuildContext context) {
|
|
@@ -228,4 +244,4 @@ class _InfoChip extends StatelessWidget {
|
|
|
),
|
|
),
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
+}
|