Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions lib/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,12 @@ class _RootRouterState extends State<RootRouter> {
}

Future<void> _handleTokenLoginAndSyncNotify(String token) async {
await VocPassAuthService.instance.handleTokenLogin(token);
await NotificationTokenService.instance.uploadNow();
try {
await VocPassAuthService.instance.handleTokenLogin(token);
await NotificationTokenService.instance.uploadNow();
} catch (e) {
if (kDebugMode) print('[DeepLink] token login failed: $e');
}
}

@override
Expand Down
4 changes: 3 additions & 1 deletion lib/screens/attendance_screen.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
Expand Down Expand Up @@ -139,7 +140,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
} else {
setState(() { _error = e.message; _isLoading = false; });
}
} catch (_) {
} catch (e) {
if (kDebugMode) print('[Attendance] 缺曠資料載入失敗: $e');
setState(() { _error = '缺曠資料載入失敗'; _isLoading = false; });
}
}
Expand Down
4 changes: 3 additions & 1 deletion lib/screens/curriculum_screen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

Expand Down Expand Up @@ -126,7 +127,8 @@ class _CurriculumScreenState extends State<CurriculumScreen> {
_isLoading = false;
});
}
} catch (_) {
} catch (e) {
if (kDebugMode) print('[Curriculum] 課表載入失敗: $e');
if (!mounted) return;
setState(() {
_error = '課表載入失敗';
Expand Down
7 changes: 5 additions & 2 deletions lib/screens/exam_score_screen.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

Expand Down Expand Up @@ -49,7 +50,8 @@ class _ExamScoreScreenState extends State<ExamScoreScreen> {
_isLoading = false;
});
}
} catch (_) {
} catch (e) {
if (kDebugMode) print('[ExamScore] 考試選單載入失敗: $e');
setState(() {
_error = '考試成績載入失敗';
_isLoading = false;
Expand Down Expand Up @@ -148,7 +150,8 @@ class _ExamScoreDetailScreenState extends State<ExamScoreDetailScreen> {
_error = e.message;
_isLoading = false;
});
} catch (_) {
} catch (e) {
if (kDebugMode) print('[ExamScore] 考試成績載入失敗: $e');
setState(() {
_error = '考試成績載入失敗';
_isLoading = false;
Expand Down
5 changes: 4 additions & 1 deletion lib/screens/following_screen.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

Expand Down Expand Up @@ -34,7 +35,9 @@ class _FollowingListScreenState extends State<FollowingListScreen> {
final profile = await VocPassAuthService.instance.fetchUser(username);
if (!mounted) return;
setState(() => _profiles[username] = profile);
} catch (_) {}
} catch (e) {
if (kDebugMode) print('[FollowingList] 取得用戶 $username 資料失敗: $e');
}
}

void _showAddDialog() {
Expand Down
6 changes: 5 additions & 1 deletion lib/screens/forum/forum_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
Expand Down Expand Up @@ -114,7 +115,10 @@ class _ForumScreenState extends State<ForumScreen> {
else
Future<ForumAdminInfo?>.value(null),
ForumService.instance.fetchVocPassAdminInfo(),
ForumService.instance.fetchTags().catchError((_) => <ForumTagOption>[]),
ForumService.instance.fetchTags().catchError((e) {
if (kDebugMode) print('[Forum] fetchTags 失敗: $e');
return <ForumTagOption>[];
}),
]);
if (!mounted) return;
setState(() {
Expand Down
5 changes: 4 additions & 1 deletion lib/screens/forum/forum_verification_sheet.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// 論壇學校驗證狀態說明

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

Expand All @@ -14,7 +15,9 @@ Future<void> showForumVerificationSheet(
if (VocPassAuthService.instance.isLoggedIn) {
try {
await VocPassAuthService.instance.refreshMe();
} catch (_) {}
} catch (e) {
if (kDebugMode) print('[ForumVerification] 刷新用戶資料失敗: $e');
}
}
if (!context.mounted) return;
await showModalBottomSheet<void>(
Expand Down
2 changes: 2 additions & 0 deletions lib/screens/home_screen.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

Expand Down Expand Up @@ -52,6 +53,7 @@ class _HomeScreenState extends State<HomeScreen> {
});
}
} catch (e) {
if (kDebugMode) print('[Home] 獎懲資料載入失敗: $e');
setState(() {
_error = '資料載入失敗';
_isLoading = false;
Expand Down
13 changes: 11 additions & 2 deletions lib/screens/restaurant_screen.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'dart:math';

import 'package:flutter/foundation.dart';

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
Expand Down Expand Up @@ -351,6 +353,7 @@ class _RestaurantDetailScreenState extends State<RestaurantDetailScreen> {
bool _isLoading = false;
bool _isLoadingMenu = false;
String? _evalError;
String? _menuError;

double? get _averageScore {
if (_evaluations.isEmpty) return null;
Expand Down Expand Up @@ -385,9 +388,10 @@ class _RestaurantDetailScreenState extends State<RestaurantDetailScreen> {
final list = await api.fetchRestaurantMenu(widget.restaurant.id);
if (!mounted) return;
setState(() { _menuItems = list; _isLoadingMenu = false; });
} catch (_) {
} catch (e) {
if (kDebugMode) print('[Restaurant] 菜單載入失敗: $e');
if (!mounted) return;
setState(() => _isLoadingMenu = false);
setState(() { _menuError = e.toString(); _isLoadingMenu = false; });
}
}

Expand Down Expand Up @@ -565,6 +569,11 @@ class _RestaurantDetailScreenState extends State<RestaurantDetailScreen> {
padding: EdgeInsets.all(16),
child: CircularProgressIndicator(),
))
else if (_menuError != null)
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Text('菜單載入失敗', style: TextStyle(color: Colors.red[400])),
)
else if (_menuItems.isEmpty)
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
Expand Down
4 changes: 3 additions & 1 deletion lib/screens/score_screen.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

Expand Down Expand Up @@ -51,7 +52,8 @@ class _ScoreScreenState extends State<ScoreScreen> {
_isLoading = false;
});
}
} catch (_) {
} catch (e) {
if (kDebugMode) print('[Score] 成績資料載入失敗: $e');
setState(() {
_error = '成績資料載入失敗';
_isLoading = false;
Expand Down
8 changes: 5 additions & 3 deletions lib/screens/w2m/w2m_result_screen.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
Expand Down Expand Up @@ -667,10 +668,11 @@ class _W2MEditSheetState extends State<_W2MEditSheet> {
_selectedDates = widget.event.dates.map((s) {
try {
return DateTime.parse(s);
} catch (_) {
return DateTime.now();
} catch (e) {
if (kDebugMode) print('[W2M] 無法解析日期 "$s": $e');
return null;
}
}).toSet();
}).whereType<DateTime>().toSet();
}

@override
Expand Down
3 changes: 2 additions & 1 deletion lib/services/api_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,8 @@ class ApiService extends ChangeNotifier {
Map<String, CourseInfo>? curriculum;
try {
curriculum = await curriculumFuture;
} catch (_) {
} catch (e) {
if (kDebugMode) print('[ApiService] 課表載入失敗(缺曠頁面仍可運作): $e');
curriculum = null;
}

Expand Down
4 changes: 3 additions & 1 deletion lib/services/forum_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,9 @@ class ForumService {
if (data is Map) {
return ForumAdminInfo.fromJson(data.cast<String, dynamic>());
}
} catch (_) {}
} catch (e) {
if (kDebugMode) print('[Forum] fetchAdminInfo 失敗: $e');
}
return null;
}

Expand Down
10 changes: 7 additions & 3 deletions lib/services/vocpass_auth_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,14 @@ class VocPassAuthService extends ChangeNotifier {
} catch (e) {
await _saveToken(null);
if (kDebugMode) print('[VocPassAuth] 取得使用者資料失敗: $e');
rethrow;
}
}

// Restore session on app start
Future<void> restoreSession() async {
if (_authToken == null || _authToken!.isEmpty) return;
// Restore session on app start.
// Returns true if session was restored, false if token was invalid/expired.
Future<bool> restoreSession() async {
if (_authToken == null || _authToken!.isEmpty) return false;
try {
final user = await fetchMe();
currentUser = user;
Expand All @@ -71,9 +73,11 @@ class VocPassAuthService extends ChangeNotifier {
}
notifyListeners();
if (kDebugMode) print('[VocPassAuth] 已恢復 session: ${user.displayName}');
return true;
} catch (e) {
await _saveToken(null);
if (kDebugMode) print('[VocPassAuth] Session 已失效: $e');
return false;
}
}

Expand Down