import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:maibu_satabot_v2/core/app/app_user_cubit.dart'; import 'package:maibu_satabot_v2/features/v2/site/presentation/cubit/site_cubit.dart'; import 'package:maibu_satabot_v2/features/v2/home/domain/entities/site_entity.dart'; import 'package:maibu_satabot_v2/features/v2/home/domain/usecases/get_home_data_usecase.dart'; import 'package:maibu_satabot_v2/features/v2/home/domain/usecases/get_site_list_usecase.dart'; import 'package:maibu_satabot_v2/features/v2/home/presentation/bloc/home_v2_event.dart'; import 'package:maibu_satabot_v2/features/v2/home/presentation/bloc/home_v2_state.dart'; class HomeV2Bloc extends Bloc { final GetHomeDataUseCase getHomeDataUseCase; final GetSiteListUseCase getSiteListUseCase; final AppUserCubit appUserCubit; final SiteCubit siteCubit; HomeV2Bloc(this.getHomeDataUseCase, this.getSiteListUseCase, this.appUserCubit, this.siteCubit) : super(const HomeV2Initial()) { on(_onLoadData); on(_onRefresh); on(_onToggleTrendType); } Future _onLoadData( HomeV2LoadData event, Emitter emit, ) async { emit(const HomeV2Loading()); final user = appUserCubit.state.user; if (user == null) { emit(const HomeV2Error('用户未登录')); return; } // 并行加载首页数据和场站列表 final homeResult = await getHomeDataUseCase(const NoParams()); final siteResult = await getSiteListUseCase(user.orgId); // 使用用户的 orgId homeResult.fold( (failure) => emit(HomeV2Error(failure.message)), (homeData) { List sites = []; SiteEntity? selectedSite; siteResult.fold( (failure) { print('加载场站列表失败: ${failure.message}'); }, (siteList) { sites = siteList; // 从全局 SiteCubit 获取之前选中的场站 final savedSelectedSite = siteCubit.state.selectedSite; // 尝试找到之前选中的场站 if (savedSelectedSite != null && siteList.isNotEmpty) { selectedSite = siteList.firstWhere( (site) => site.id == savedSelectedSite.id, orElse: () => siteList.first, ); } else { // 没有选中过,默认选中第一个 selectedSite = siteList.isNotEmpty ? siteList.first : null; } // 更新全局 SiteCubit 的选中状态 if (selectedSite != null) { siteCubit.selectSite(selectedSite!); } }, ); emit(HomeV2Loaded( homeData: homeData, sites: sites, selectedSite: selectedSite, )); }, ); } Future _onRefresh( HomeV2Refresh event, Emitter emit, ) async { if (state is HomeV2Loaded) { final currentState = state as HomeV2Loaded; final homeResult = await getHomeDataUseCase(const NoParams()); homeResult.fold( (failure) => emit(HomeV2Error(failure.message)), (homeData) { emit(HomeV2Loaded( homeData: homeData, trendType: currentState.trendType, sites: currentState.sites, selectedSite: currentState.selectedSite, )); }, ); } } void _onToggleTrendType( HomeV2ToggleTrendType event, Emitter emit, ) { if (state is HomeV2Loaded) { final currentState = state as HomeV2Loaded; emit(currentState.copyWith(trendType: event.type)); print('切换趋势类型:${event.type}'); } } }