import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:maibu_satabot_v2/features/devices/domain/entities/device_entity.dart'; import 'package:maibu_satabot_v2/features/devices/domain/repositories/device_repository.dart'; import 'package:maibu_satabot_v2/features/devices/domain/usecases/get_user_device_usecase.dart'; import 'devices_state.dart'; class DevicesCubit extends Cubit { final GetUserDeviceUseCase _getUserDeviceUseCase; final DeviceRepository repository; DevicesCubit(this.repository, this._getUserDeviceUseCase) : super(const DevicesState()); // 获取所有设备列表 Future fetchAllDevices(String username) async { emit(state.copyWith(isLoading: true)); try { // 模拟网络请求获取列表 var resultEither = await _getUserDeviceUseCase.call( GetUserDeviceParams(username), ); resultEither.fold( (failure) => emit( state.copyWith( isLoading: false, errorMessage: failure.message, // 假设你的 Failure 类有 message 字段 ), ), (deviceList) { emit( state.copyWith( devices: deviceList, selectedDevice: deviceList.isNotEmpty ? deviceList.first : null, isLoading: false, ), ); }, ); } catch (e) { emit(state.copyWith(isLoading: false, errorMessage: e.toString())); } } // 切换当前选中的设备 void selectDevice(DeviceEntity device) { emit(state.copyWith(selectedDevice: device)); } // 更新单个设备的状态(例如从 Tcp 收到实时电量更新) void updateDeviceStatus(DeviceEntity updatedDevice) { final newList = state.devices.map((d) { return d.deviceName == updatedDevice.deviceName ? updatedDevice : d; }).toList(); // 如果更新的是当前选中的设备,也要同步更新 selectedDevice final newSelected = state.selectedDevice?.deviceName == updatedDevice.deviceName ? updatedDevice : state.selectedDevice; emit(state.copyWith(devices: newList, selectedDevice: newSelected)); } Future switchDevice(DeviceEntity device) async { // 保持现有列表,只改 loading emit(state.copyWith(isLoading: true)); final result = await repository.switchDevice("app", device.deviceName); result.fold((l) { emit(state.copyWith(isLoading: false, errorMessage: l.message)); selectDevice(device); }, (r) => emit(state.copyWith(isLoading: false, selectedDevice: device))); } }