/// 홈 컨트롤러 (MVCS의 Controller 레이어) /// /// 비즈니스 로직과 상태 관리를 담당합니다. /// View는 이 Controller를 통해 데이터에 접근합니다. library; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../models/member.dart'; import '../models/album.dart'; import '../models/schedule.dart'; import '../services/members_service.dart'; import '../services/albums_service.dart'; import '../services/schedules_service.dart'; /// 홈 상태 class HomeState { final List members; final List albums; final List schedules; final bool isLoading; final bool dataLoaded; final String? error; const HomeState({ this.members = const [], this.albums = const [], this.schedules = const [], this.isLoading = true, this.dataLoaded = false, this.error, }); /// 상태 복사 (불변성 유지) HomeState copyWith({ List? members, List? albums, List? schedules, bool? isLoading, bool? dataLoaded, String? error, }) { return HomeState( members: members ?? this.members, albums: albums ?? this.albums, schedules: schedules ?? this.schedules, isLoading: isLoading ?? this.isLoading, dataLoaded: dataLoaded ?? this.dataLoaded, error: error, ); } } /// 홈 컨트롤러 class HomeController extends Notifier { @override HomeState build() { // 초기 데이터 로드 Future.microtask(() => loadData()); return const HomeState(); } /// 데이터 로드 (멤버, 앨범, 일정) Future loadData() async { state = state.copyWith(isLoading: true, error: null); try { final results = await Future.wait([ getActiveMembers(), getRecentAlbums(2), getUpcomingSchedules(3), ]); state = state.copyWith( members: results[0] as List, albums: results[1] as List, schedules: results[2] as List, isLoading: false, dataLoaded: true, ); } catch (e) { state = state.copyWith( isLoading: false, dataLoaded: true, error: e.toString(), ); } } } /// 홈 Provider final homeProvider = NotifierProvider( HomeController.new, );