소스 검색

初步调通

ValiZhang 11 달 전
부모
커밋
5bac445180
4개의 변경된 파일76개의 추가작업 그리고 33개의 파일을 삭제
  1. 24 6
      lib/features/challenge/view_models/challenge_list_vm.dart
  2. 43 27
      lib/features/challenge/views/challenge_list_screen.dart
  3. 8 0
      pubspec.lock
  4. 1 0
      pubspec.yaml

+ 24 - 6
lib/features/challenge/view_models/challenge_list_vm.dart

@@ -1,6 +1,7 @@
 import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:japp_flutter/core/models/challenge_model.dart';
 import 'package:japp_flutter/core/proviers/repository_providers.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:japp_flutter/core/repositories/challenge_repository.dart';
 
 
@@ -14,15 +15,32 @@ class ChallengeListViewModel extends AsyncNotifier<List<ChallengeModel>> {
   @override
   Future<List<ChallengeModel>> build() async {
     // 初始加载数据(可选)
-    return []; // 初始化为空列表,或直接调用 loadChallenges()
+    return loadChallenges(); // 初始化为空列表,或直接调用 loadChallenges()
   }
 
-  /// 加载挑战列表(自动处理加载/错误状态)
-  Future<void> loadChallenges() async {
-    state = const AsyncLoading();
-    state = await AsyncValue.guard(() => _repository.getAllChallenges());
+
+  Future<List<ChallengeModel>> loadChallenges() async {
+    state = const AsyncValue.loading();
+    try {
+      final challenges = await _repository.getAllChallenges();
+      state = AsyncValue.data(challenges);
+      return challenges;
+    } catch (e, stack) {
+      state = AsyncValue.error(e, stack);
+      
+      rethrow;
+    }
   }
 
+  // /// 加载挑战列表(自动处理加载/错误状态)
+  // Future<void> loadChallenges() async {
+  //   state = const AsyncLoading();
+  //   state = await AsyncValue.guard(() => _repository.getAllChallenges());
+  // }
+
   /// 刷新数据(别名方法)
-  Future<void> refresh() async => loadChallenges();
+  Future<void> refresh() async {
+      state = const AsyncValue.loading();
+      await loadChallenges(); // 复用加载逻辑
+  }
 }

+ 43 - 27
lib/features/challenge/views/challenge_list_screen.dart

@@ -18,7 +18,7 @@ class ChallengeListScreen extends ConsumerWidget {
         actions: [
           IconButton(
             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)),
             const SizedBox(height: 16),
             ElevatedButton(
-              onPressed: () => ref.refresh(challengeListProvider.future),
+              onPressed: () =>
+                  ref.read(challengeListProvider.notifier).refresh(),
               child: const Text('重试'),
             ),
           ],
@@ -51,24 +52,29 @@ class ChallengeListScreen extends ConsumerWidget {
       data: (challenges) => challenges.isEmpty
           ? const Center(child: Text('暂无挑战', style: TextStyle(fontSize: 18)))
           : RefreshIndicator(
-              onRefresh: () => ref.read(challengeListProvider.notifier).refresh(),
+              onRefresh: () =>
+                  ref.read(challengeListProvider.notifier).refresh(),
               child: ListView.builder(
                 padding: const EdgeInsets.all(16),
                 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;
 
   const ChallengeCard({super.key, required this.challenge});
 
   @override
-  Widget build(BuildContext context, WidgetRef ref) {
+  Widget build(BuildContext context) {
     final theme = Theme.of(context);
 
     return Card(
@@ -85,7 +91,10 @@ class ChallengeCard extends ConsumerWidget {
                 Expanded(
                   child: Text(
                     challenge.title,
-                    style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
+                    style: const TextStyle(
+                      fontSize: 18,
+                      fontWeight: FontWeight.bold,
+                    ),
                   ),
                 ),
                 _DifficultyChip(difficulty: challenge.difficulty),
@@ -117,15 +126,19 @@ class ChallengeCard extends ConsumerWidget {
 // 将复杂子组件拆分为独立组件
 class _DifficultyChip extends StatelessWidget {
   final String difficulty;
-  
+
   const _DifficultyChip({required this.difficulty});
 
   Color _getColor() {
     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 endDate;
   final int remainingDays;
-  
+
   const _ProgressBar({
     required this.startDate,
     required this.endDate,
@@ -159,7 +172,10 @@ class _ProgressBar extends StatelessWidget {
     return Column(
       crossAxisAlignment: CrossAxisAlignment.start,
       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),
         LinearProgressIndicator(
           value: progress,
@@ -172,8 +188,14 @@ class _ProgressBar extends StatelessWidget {
         Row(
           mainAxisAlignment: MainAxisAlignment.spaceBetween,
           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 {
   final int participants;
   final int remainingDays;
-  
-  const _CardFooter({
-    required this.participants,
-    required this.remainingDays,
-  });
+
+  const _CardFooter({required this.participants, required this.remainingDays});
 
   @override
   Widget build(BuildContext context) {
@@ -205,11 +224,8 @@ class _CardFooter extends StatelessWidget {
 class _InfoChip extends StatelessWidget {
   final IconData icon;
   final String text;
-  
-  const _InfoChip({
-    required this.icon,
-    required this.text,
-  });
+
+  const _InfoChip({required this.icon, required this.text});
 
   @override
   Widget build(BuildContext context) {
@@ -228,4 +244,4 @@ class _InfoChip extends StatelessWidget {
       ),
     );
   }
-}
+}

+ 8 - 0
pubspec.lock

@@ -227,6 +227,14 @@ packages:
       url: "https://pub.flutter-io.cn"
     source: hosted
     version: "2.6.1"
+  riverpod_annotation:
+    dependency: "direct main"
+    description:
+      name: riverpod_annotation
+      sha256: e14b0bf45b71326654e2705d462f21b958f987087be850afd60578fcd502d1b8
+      url: "https://pub.flutter-io.cn"
+    source: hosted
+    version: "2.6.1"
   sky_engine:
     dependency: transitive
     description: flutter

+ 1 - 0
pubspec.yaml

@@ -40,6 +40,7 @@ dependencies:
   sqflite: ^2.4.2
   flutter_hooks: ^0.21.2
   flutter_riverpod: ^2.6.1
+  riverpod_annotation: ^2.6.1
   
 dev_dependencies:
   flutter_test: