Files
feature-next-arch/lib/features/home/presentation/bloc/permission_request_bloc.dart
Songzex 354f7d6290 优化了tcp实时更新对UI线程的压力和对用弹窗的重复弹窗的影响。
更换了路径规划的的经纬度的字段名和取操作的名字更换。
2026-06-08 13:35:36 +08:00

120 lines
4.1 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:async';
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:get_it/get_it.dart';
import '../../../../core/logging/i_logger_service.dart';
import '../../../../core/network/net_message_dispatcher.dart';
import '../../../remote_control/domain/repositories/remote_control_repository.dart';
import 'permission_request_event.dart';
import 'permission_request_state.dart';
class PermissionRequestBloc
extends Bloc<PermissionRequestEvent, PermissionRequestState> {
final NetMessageDispatcher _dispatcher;
final RemoteControlRepository _repository;
final ILoggerService _logger = GetIt.I<ILoggerService>();
// 🔥 保存订阅引用,用于管理生命周期
StreamSubscription? _permissionSubscription;
PermissionRequestBloc(this._dispatcher, this._repository)
: super(const PermissionRequestInitial()) {
// 🔥 核心:直接在构造函数中建立 0x12 监听(通过 NetMessageDispatcher)
// 🔥 注意:RemoteControlCubit 已经在处理 0x12 权限请求,这里不再重复监听
// _initPermissionListener();
// 事件处理
on<PermissionRequestReceived>(_handleRequestReceived);
on<PermissionDialogDismissed>(_handleDialogDismissed);
}
// 🔥 通过 NetMessageDispatcher 监听 TCP 0x12 指令,解析权限请求
// 🔥 已禁用:RemoteControlCubit 统一处理权限请求,避免重复弹窗
void _initPermissionListener() {
debugPrint(
'🔗 [PermissionRequestBloc] 初始化 0x12 权限监听器(通过 NetMessageDispatcher)',
);
_logger.logWithLevel(
'🔗 [PermissionRequestBloc] 初始化 0x12 权限监听器',
shouldLog: true,
);
// 🔥 已禁用:权限请求统一由 RemoteControlCubit 处理,避免重复弹窗
// _permissionSubscription = _dispatcher.onCommand(0x12).listen((packet) {
// ...
// });
debugPrint(
'🔍 [PermissionRequestBloc] ⚠️ 权限监听已禁用,统一由 RemoteControlCubit 处理',
);
_logger.logWithLevel(
'>>> [PermissionRequestBloc] ⚠️ 权限监听已禁用,统一由 RemoteControlCubit 处理',
shouldLog: true,
);
}
Future<void> _handleRequestReceived(
PermissionRequestReceived event,
Emitter<PermissionRequestState> emit,
) async {
debugPrint(
'📤 [PermissionRequestBloc] emit DialogVisible - platform=${event.platform}',
);
_logger.logWithLevel(
'📤 [PermissionRequestBloc] emit DialogVisible - platform=${event.platform}',
shouldLog: true,
);
emit(
PermissionRequestDialogVisible(
platform: event.platform,
requestType: event.requestType,
),
);
_logger.logWithLevel(
'📤 [PermissionRequestBloc] ✅ 已 emit DialogVisible 状态',
shouldLog: true,
);
}
Future<void> _handleDialogDismissed(
PermissionDialogDismissed event,
Emitter<PermissionRequestState> emit,
) async {
debugPrint('📤 [PermissionRequestBloc] emit DialogHidden');
_logger.logWithLevel('📤 [PermissionRequestBloc] emit DialogHidden');
// 🔥 发送响应到机器人(和远程遥控页面一样)
if (event.deviceId.isNotEmpty) {
debugPrint(
'📤 [PermissionRequestBloc] 发送权限响应: agree=${event.agree}, deviceId=${event.deviceId}',
);
_repository.respondPermission(event.agree, event.deviceId);
}
emit(const PermissionRequestDialogHidden());
}
@override
Future<void> close() {
debugPrint('🚫 [PermissionRequestBloc] 关闭,取消订阅');
_logger.logWithLevel('🚫 [PermissionRequestBloc] 关闭', shouldLog: true);
_permissionSubscription?.cancel();
return super.close();
}
/// 🔥 公开方法:重新初始化监听器(TCP 重连后调用)
void reinitListener() {
debugPrint('🔄 [PermissionRequestBloc] 重新初始化监听器');
_logger.logWithLevel(
'🔄 [PermissionRequestBloc] 重新初始化监听器',
shouldLog: true,
);
_permissionSubscription?.cancel();
_initPermissionListener();
}
}