TDD 작성
This commit is contained in:
@@ -30,17 +30,78 @@ class MemberService with ChangeNotifier {
|
||||
_token = token;
|
||||
_apiService.setToken(token);
|
||||
|
||||
// 이벤트 구독
|
||||
_eventSubscription = EventBus().stream.listen((event) {
|
||||
if (event is ClubChangedEvent) {
|
||||
// 이벤트 구독 - 기존 구독이 있으면 취소 후 다시 구독
|
||||
_eventSubscription?.cancel();
|
||||
_eventSubscription = EventBus().on<ClubChangedEvent>().listen((event) {
|
||||
if (event.clubId.isNotEmpty) {
|
||||
setClubId(event.clubId);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 비동기 리소스 상태 로깅
|
||||
Future<void> _logResourceState(String context) async {
|
||||
if (kDebugMode) {
|
||||
debugPrint('===== MemberService 비동기 리소스 상태 ($context) =====');
|
||||
debugPrint('시간: ${DateTime.now().toIso8601String()}');
|
||||
debugPrint('구독 상태: ${_eventSubscription != null ? '활성' : '비활성'}');
|
||||
debugPrint('클럽 ID: $_clubId');
|
||||
debugPrint('토큰 상태: ${_token != null ? '있음' : '없음'}');
|
||||
debugPrint('로딩 상태: $_isLoading');
|
||||
debugPrint('회원 수: ${_members.length}');
|
||||
debugPrint('EventBus 활성 구독 수: ${EventBus.activeSubscriptionCount}');
|
||||
debugPrint('===========================================');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_eventSubscription?.cancel();
|
||||
Future<void> dispose() async {
|
||||
// dispose 시작 상태 로깅
|
||||
if (kDebugMode) {
|
||||
debugPrint('MemberService: dispose 시작');
|
||||
}
|
||||
await _logResourceState('dispose 시작');
|
||||
|
||||
// 이벤트 구독 취소 확실히 처리
|
||||
if (_eventSubscription != null) {
|
||||
try {
|
||||
// 구독 취소 전 로깅
|
||||
if (kDebugMode) {
|
||||
debugPrint('MemberService: 구독 취소 시작');
|
||||
}
|
||||
|
||||
// 구독 취소
|
||||
_eventSubscription!.cancel();
|
||||
|
||||
// 마이크로태스크 실행으로 비동기 작업 완료 보장
|
||||
await Future.microtask(() {});
|
||||
|
||||
// 구독 취소 후 로깅
|
||||
if (kDebugMode) {
|
||||
debugPrint('MemberService: 구독 취소 완료');
|
||||
}
|
||||
|
||||
// 구독 참조 제거
|
||||
_eventSubscription = null;
|
||||
} catch (e) {
|
||||
if (kDebugMode) {
|
||||
debugPrint('MemberService: 구독 취소 중 오류 - $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 추가 마이크로태스크 실행으로 비동기 작업 완료 보장 (타이머 생성 회피)
|
||||
await Future.microtask(() {});
|
||||
await Future.microtask(() {});
|
||||
|
||||
// dispose 완료 후 상태 로깅
|
||||
await _logResourceState('dispose 완료');
|
||||
|
||||
// 구독 수 로깅 - 지연 없이 즉시 처리
|
||||
if (kDebugMode) {
|
||||
debugPrint('MemberService: dispose 완료 후 구독 수 - ${EventBus.activeSubscriptionCount}');
|
||||
}
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -49,6 +110,11 @@ class MemberService with ChangeNotifier {
|
||||
// 클럽 ID가 변경된 경우에만 처리
|
||||
if (_clubId != clubId) {
|
||||
_clubId = clubId;
|
||||
|
||||
// SharedPreferences에 저장
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setString(ApiConfig.clubIdKey, clubId);
|
||||
|
||||
notifyListeners();
|
||||
|
||||
// 새 클럽의 회원 목록 가져오기
|
||||
@@ -237,4 +303,46 @@ class MemberService with ChangeNotifier {
|
||||
throw Exception('회원 삭제에 실패했습니다: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// 여러 회원 ID로 회원 정보 가져오기
|
||||
Future<List<Member>> fetchMembersByIds(String clubId, List<String> memberIds) async {
|
||||
if (_token == null) {
|
||||
throw Exception('인증이 필요합니다');
|
||||
}
|
||||
|
||||
if (memberIds.isEmpty) {
|
||||
return [];
|
||||
}
|
||||
|
||||
try {
|
||||
// 이미 로드된 회원 정보 중에서 필터링
|
||||
if (_members.isNotEmpty && _clubId == clubId) {
|
||||
final cachedMembers = _members.where((member) => memberIds.contains(member.id)).toList();
|
||||
|
||||
// 모든 회원 정보가 캐시에 있는 경우
|
||||
if (cachedMembers.length == memberIds.length) {
|
||||
return cachedMembers;
|
||||
}
|
||||
}
|
||||
|
||||
// API로 회원 정보 요청
|
||||
final data = await _apiService.post(
|
||||
'${ApiConfig.clubs}/members/batch',
|
||||
data: {
|
||||
'clubId': clubId,
|
||||
'memberIds': memberIds,
|
||||
},
|
||||
);
|
||||
|
||||
if (data is List) {
|
||||
return data.map((memberData) => Member.fromJson(memberData)).toList();
|
||||
} else if (data['members'] != null && data['members'] is List) {
|
||||
return (data['members'] as List).map((memberData) => Member.fromJson(memberData)).toList();
|
||||
} else {
|
||||
throw Exception('회원 정보 형식이 올바르지 않습니다');
|
||||
}
|
||||
} catch (e) {
|
||||
throw Exception('회원 정보를 불러오는데 실패했습니다: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user