Files
flutterApp/lib/features/v2/my/presentation/cubit/my_cubit.dart

103 lines
2.9 KiB
Dart

import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:maibu_satabot_v2/features/v2/my/domain/entities/my_entities.dart';
import 'package:maibu_satabot_v2/features/v2/my/domain/usecases/clear_cache_usecase.dart';
import 'package:maibu_satabot_v2/features/v2/my/domain/usecases/get_menu_items_usecase.dart';
import 'package:maibu_satabot_v2/features/v2/my/domain/usecases/toggle_night_mode_usecase.dart';
import 'package:maibu_satabot_v2/features/v2/my/presentation/states/my_state.dart';
/// 我的页面 Cubit
class MyCubit extends Cubit<MyState> {
MyCubit({
required GetMenuItemsUseCase getMenuItemsUseCase,
required ToggleNightModeUseCase toggleNightModeUseCase,
required ClearCacheUseCase clearCacheUseCase,
}) : _getMenuItemsUseCase = getMenuItemsUseCase,
_toggleNightModeUseCase = toggleNightModeUseCase,
_clearCacheUseCase = clearCacheUseCase,
super(MyInitial());
final GetMenuItemsUseCase _getMenuItemsUseCase;
final ToggleNightModeUseCase _toggleNightModeUseCase;
final ClearCacheUseCase _clearCacheUseCase;
/// 加载数据
Future<void> loadData() async {
emit(MyLoading());
try {
final menuResult = await _getMenuItemsUseCase();
final menuItems = menuResult.fold(
(failure) => <MenuItemEntity>[],
(items) => items,
);
if (menuItems.isEmpty) {
emit(const MyError('加载菜单失败'));
return;
}
// 模拟用户信息(实际应从 Auth 模块获取)
final userProfile = UserProfileEntity(
name: '张工程师',
role: '运维工程师',
avatar: '',
userId: 'ENG2024001',
);
emit(MyLoaded(
userProfile: userProfile,
menuItems: menuItems,
));
} catch (e) {
emit(MyError('加载数据失败: $e'));
}
}
/// 切换夜间模式
Future<void> toggleNightMode(bool enabled) async {
final currentState = state;
if (currentState is MyLoaded) {
// 乐观更新 UI
emit(currentState.copyWith(isNightMode: enabled));
final result = await _toggleNightModeUseCase(enabled);
result.fold(
(failure) {
// 如果失败,回滚状态
emit(currentState.copyWith(isNightMode: !enabled));
emit(MyError('切换夜间模式失败'));
},
(_) {
// 成功,保持当前状态
},
);
}
}
/// 清除缓存
Future<void> clearCache() async {
final currentState = state;
if (currentState is! MyLoaded) return;
emit(MyLoading());
final result = await _clearCacheUseCase();
result.fold(
(failure) {
emit(MyError('清除缓存失败: ${failure.message}'));
},
(success) {
emit(currentState.copyWith(cacheSize: '0 MB'));
},
);
}
/// 刷新数据
Future<void> refresh() async {
await loadData();
}
}