Files
feature-next-arch/lib/features/v2/home/presentation/bloc/home_v2_bloc.dart

114 lines
3.7 KiB
Dart
Raw Normal View History

2026-05-19 08:46:35 +08:00
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';
2026-05-19 08:46:35 +08:00
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';
2026-05-19 08:46:35 +08:00
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<HomeV2Event, HomeV2State> {
final GetHomeDataUseCase getHomeDataUseCase;
final GetSiteListUseCase getSiteListUseCase;
final AppUserCubit appUserCubit;
final SiteCubit siteCubit;
2026-05-19 08:46:35 +08:00
HomeV2Bloc(this.getHomeDataUseCase, this.getSiteListUseCase, this.appUserCubit, this.siteCubit) : super(const HomeV2Initial()) {
2026-05-19 08:46:35 +08:00
on<HomeV2LoadData>(_onLoadData);
on<HomeV2Refresh>(_onRefresh);
on<HomeV2ToggleTrendType>(_onToggleTrendType);
}
Future<void> _onLoadData(
HomeV2LoadData event,
Emitter<HomeV2State> 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
2026-05-19 08:46:35 +08:00
homeResult.fold(
2026-05-19 08:46:35 +08:00
(failure) => emit(HomeV2Error(failure.message)),
(homeData) {
List<SiteEntity> 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,
));
},
2026-05-19 08:46:35 +08:00
);
}
Future<void> _onRefresh(
HomeV2Refresh event,
Emitter<HomeV2State> emit,
) async {
if (state is HomeV2Loaded) {
final currentState = state as HomeV2Loaded;
final homeResult = await getHomeDataUseCase(const NoParams());
2026-05-19 08:46:35 +08:00
homeResult.fold(
2026-05-19 08:46:35 +08:00
(failure) => emit(HomeV2Error(failure.message)),
(homeData) {
emit(HomeV2Loaded(
homeData: homeData,
trendType: currentState.trendType,
sites: currentState.sites,
selectedSite: currentState.selectedSite,
));
},
2026-05-19 08:46:35 +08:00
);
}
}
void _onToggleTrendType(
HomeV2ToggleTrendType event,
Emitter<HomeV2State> emit,
) {
if (state is HomeV2Loaded) {
final currentState = state as HomeV2Loaded;
emit(currentState.copyWith(trendType: event.type));
print('切换趋势类型:${event.type}');
}
}
}