diff --git a/lib/login/login/starLock_login_logic.dart b/lib/login/login/starLock_login_logic.dart index d0f5d2cd..a03eca9f 100755 --- a/lib/login/login/starLock_login_logic.dart +++ b/lib/login/login/starLock_login_logic.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:star_lock/apm/apm_helper.dart'; @@ -174,8 +176,10 @@ class StarLockLoginLogic extends BaseGetXController { state.canNext.value = state.pwdIsOK && state.isEmailOrPhone; } + late StreamSubscription _agreePrivacySubscription; + void _initEventListen() { - eventBus + _agreePrivacySubscription = eventBus .on() .listen((AgreePrivacyAgreement event) async { await JverifyOneClickLoginManage(); @@ -194,6 +198,8 @@ class StarLockLoginLogic extends BaseGetXController { @override void onClose() { + // 取消事件监听 + _agreePrivacySubscription.cancel(); state.onClose(); super.onClose(); } diff --git a/lib/main.dart b/lib/main.dart index 9e9f5927..ee1c0ca7 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -106,7 +106,6 @@ Future privacySDKInitialization() async { // 初始化一键登录服务 final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic()); await JverifyOneClickLoginManage(); - loginLogic.oneClickLoginAction(); loginLogic.state.isCheckVerifyEnable.value = await JverifyOneClickLoginManage().checkVerifyEnable(); eventBus.fire(AgreePrivacyAgreement()); diff --git a/lib/main/lockDetail/card/addICCard/addICCard_logic.dart b/lib/main/lockDetail/card/addICCard/addICCard_logic.dart index dda931b0..2729347b 100755 --- a/lib/main/lockDetail/card/addICCard/addICCard_logic.dart +++ b/lib/main/lockDetail/card/addICCard/addICCard_logic.dart @@ -80,7 +80,7 @@ class AddICCardLogic extends BaseGetXController { final List token = reply.data.sublist(5, 9); final List saveStrList = changeIntListToStringList(token); Storage.setStringList(saveBlueToken, saveStrList); - // AppLog.log('添加卡token:$token'); + AppLog.log('添加卡token:$token'); IoSenderManage.senderAddCardWithTimeCycleCoercionCommand( keyID: '1', @@ -107,6 +107,14 @@ class AddICCardLogic extends BaseGetXController { token: token, isBeforeAddUser: false); break; + case 0xFE: + case 12: + // 管理员已满 + state.ifAddState.value = false; + showToast('管理员已满'.tr, something: () { + Get.back(); + }); + break; default: //失败 state.ifAddState.value = false; @@ -146,6 +154,7 @@ class AddICCardLogic extends BaseGetXController { Get.close(1); break; case 0xFE: + case 0x12: // 管理员已满 showToast('管理员已满'.tr); Get.close(1); diff --git a/lib/main/lockDetail/card/cardList/cardList_logic.dart b/lib/main/lockDetail/card/cardList/cardList_logic.dart index a11cd18c..022ff0fb 100755 --- a/lib/main/lockDetail/card/cardList/cardList_logic.dart +++ b/lib/main/lockDetail/card/cardList/cardList_logic.dart @@ -28,6 +28,7 @@ class CardListLogic extends BaseGetXController { // 获取解析后的数据 late StreamSubscription _replySubscription; + void _initReplySubscription() { _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { @@ -69,11 +70,15 @@ class CardListLogic extends BaseGetXController { userID: (await Storage.getUid())!, cardNo: state.deletCardNo, useCountLimit: 0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + operate: state.isDeletAll == true ? 3 : 2, + // 0:注册 1:修改 2:删除 3:删除全部 isAdmin: 0, - isForce: 0, // 是否是胁迫 - isRound: 0, // 是否是循环 - weekRound: 0, // 周循环 + isForce: 0, + // 是否是胁迫 + isRound: 0, + // 是否是循环 + weekRound: 0, + // 周循环 startDate: 0x11223344, endDate: 0x11223344, startTime: '0', @@ -116,11 +121,15 @@ class CardListLogic extends BaseGetXController { userID: (await Storage.getUid())!, cardNo: state.deletCardNo, useCountLimit: 0xffff, - operate: state.isDeletAll == true ? 3 : 2, // 0:注册 1:修改 2:删除 3:删除全部 + operate: state.isDeletAll == true ? 3 : 2, + // 0:注册 1:修改 2:删除 3:删除全部 isAdmin: 0, - isForce: 0, // 是否是胁迫 - isRound: 0, // 是否是循环 - weekRound: 0, // 周循环 + isForce: 0, + // 是否是胁迫 + isRound: 0, + // 是否是循环 + weekRound: 0, + // 周循环 startDate: 0x11223344, endDate: 0x11223344, startTime: '0', @@ -193,6 +202,7 @@ class CardListLogic extends BaseGetXController { // 监听修改完详情之后刷新列表 late StreamSubscription _teamEvent; + void _initRefreshAction() { _teamEvent = eventBus .on() @@ -240,6 +250,7 @@ class CardListLogic extends BaseGetXController { _initRefreshAction(); } + await getICCardListData(isRefresh: true); } @override diff --git a/lib/main/lockDetail/card/cardList/cardList_page.dart b/lib/main/lockDetail/card/cardList/cardList_page.dart index 705d5c8c..f5fe77e1 100755 --- a/lib/main/lockDetail/card/cardList/cardList_page.dart +++ b/lib/main/lockDetail/card/cardList/cardList_page.dart @@ -31,24 +31,24 @@ class _CardListPageState extends State with RouteAware { final CardListLogic logic = Get.put(CardListLogic()); final CardListState state = Get.find().state; - Future getHttpData({required bool isRefresh}) async { - final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); - if (isDemoMode == false) { - logic - .getICCardListData(isRefresh: isRefresh) - .then((FingerprintListDataEntity value) { - if (mounted) { - setState(() {}); - } - }); - } - } + // Future logic.getICCardListData({required bool isRefresh}) async { + // final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + // if (isDemoMode == false) { + // logic + // .getICCardListData(isRefresh: isRefresh) + // .then((FingerprintListDataEntity value) { + // if (mounted) { + // setState(() {}); + // } + // }); + // } + // } @override void initState() { super.initState(); - getHttpData(isRefresh: true); + // logic.getICCardListData(isRefresh: true); } @override @@ -92,17 +92,17 @@ class _CardListPageState extends State with RouteAware { ), body: EasyRefreshTool( onRefresh: () { - getHttpData(isRefresh: true); + logic.getICCardListData(isRefresh: true); }, onLoad: () { - getHttpData(isRefresh: false); + logic.getICCardListData(isRefresh: false); }, child: Column( children: [ KeySearchWidget( editingController: state.searchController, onSubmittedAction: () { - getHttpData(isRefresh: true); + logic.getICCardListData(isRefresh: true); }, ), SizedBox(height: 20.h), @@ -115,10 +115,10 @@ class _CardListPageState extends State with RouteAware { 'fromType': 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入 })! .then((value) { - getHttpData(isRefresh: true); + logic.getICCardListData(isRefresh: true); }); // if (data != null) { - // getHttpData(isRefresh: true); + // logic.getICCardListData(isRefresh: true); // } }, ), @@ -180,9 +180,9 @@ class _CardListPageState extends State with RouteAware { arguments: { 'fingerprintItemData': fingerprintItemData, })! - .then((value) => getHttpData(isRefresh: true)); + .then((value) => logic.getICCardListData(isRefresh: true)); // if (data != null) { - // getHttpData(isRefresh: true); + // logic.getICCardListData(isRefresh: true); // } }), ); diff --git a/lib/main/lockDetail/face/addFace/addFace_logic.dart b/lib/main/lockDetail/face/addFace/addFace_logic.dart index d7fe6bd3..5900580c 100755 --- a/lib/main/lockDetail/face/addFace/addFace_logic.dart +++ b/lib/main/lockDetail/face/addFace/addFace_logic.dart @@ -54,7 +54,7 @@ class AddFaceLogic extends BaseGetXController { // 最大图片数 state.maxRegCount.value = reply.data[11]; - // AppLog.log('人脸开始state.maxRegCount.value:${state.maxRegCount.value}'); + AppLog.log('人脸开始state.maxRegCount.value:${state.maxRegCount.value}'); break; case 0x06: //无权限 @@ -89,6 +89,12 @@ class AddFaceLogic extends BaseGetXController { isBeforeAddUser: false ); break; + case 0xFE: + case 12: + // 管理员已满 + showToast('管理员已满'.tr); + Get.close(1); + break; default: //失败 state.ifAddState.value = false; @@ -112,9 +118,9 @@ class AddFaceLogic extends BaseGetXController { Get.close(1); break; case 0xFE: + case 12: // 管理员已满 showToast('管理员已满'.tr); - state.ifAddState.value = false; Get.close(1); break; case 0xFD: @@ -138,7 +144,7 @@ class AddFaceLogic extends BaseGetXController { // 添加人脸中 // 当前注册数 state.regIndex.value = reply.data[6]; - // AppLog.log('注册人脸过程state.regIndex.value:${state.regIndex.value}'); + AppLog.log('注册人脸过程state.regIndex.value:${state.regIndex.value}'); break; } diff --git a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart index 6bd97fb8..c5ff8d1c 100755 --- a/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart +++ b/lib/main/lockDetail/fingerprint/addFingerprint/addFingerprint_logic.dart @@ -106,6 +106,7 @@ class AddFingerprintLogic extends BaseGetXController { isBeforeAddUser: false); break; case 0xFE: + case 12: // 管理员已满 state.ifAddState.value = false; showToast('管理员已满'.tr, something: () { @@ -139,10 +140,12 @@ class AddFingerprintLogic extends BaseGetXController { Get.close(1); break; case 0xFE: - // 管理员已满 - showToast('管理员已满'.tr); + case 12: + // 管理员已满 state.ifAddState.value = false; - Get.close(1); + showToast('管理员已满'.tr, something: () { + Get.back(); + }); break; case 0xFD: // 用户已满 diff --git a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart index 09523db0..3c886df8 100755 --- a/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart +++ b/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart @@ -404,8 +404,8 @@ class FingerprintListLogic extends BaseGetXController { void _initRefreshAction() { _teamEvent = eventBus .on() - .listen((OtherTypeRefreshListEvent event) { - getFingerprintsListData(isRefresh: true); + .listen((OtherTypeRefreshListEvent event) async { + await getFingerprintsListData(isRefresh: true); }); } @@ -460,7 +460,7 @@ class FingerprintListLogic extends BaseGetXController { if (isDemoMode == false) { _initReplySubscription(); - _initRefreshAction(); + // _initRefreshAction(); getFingerprintsListData(isRefresh: true); } } diff --git a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index 80198af5..03b69a5b 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -814,7 +814,7 @@ class LockDetailLogic extends BaseGetXController { } }); - eventBus + state.DetailLockInfo = eventBus .on() .listen((PassCurrentLockInformationEvent event) { if (event.lockSetInfoData.lockSettingInfo != null && @@ -839,7 +839,7 @@ class LockDetailLogic extends BaseGetXController { } }); - eventBus + state.SuccessfulDistributionNetworkEvent = eventBus .on() .listen((SuccessfulDistributionNetwork event) { // 配网成功获取一下配网信息 diff --git a/lib/main/lockDetail/lockDetail/lockDetail_state.dart b/lib/main/lockDetail/lockDetail/lockDetail_state.dart index 760f1289..01178f52 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_state.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_state.dart @@ -14,6 +14,8 @@ class LockDetailState { late StreamSubscription replySubscription; StreamSubscription? lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent; StreamSubscription? LockSetChangeSetRefreshLockDetailWithTypeSubscription; + StreamSubscription? DetailLockInfo; + StreamSubscription? SuccessfulDistributionNetworkEvent; String lockNetToken = '0'; int differentialTime = 0;// 服务器时间与本地时间差值 diff --git a/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart b/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart index 19ca548d..eb843a3a 100755 --- a/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart +++ b/lib/main/lockDetail/palm/addPalm/addPalm_logic.dart @@ -90,6 +90,12 @@ class AddPalmLogic extends BaseGetXController { isBeforeAddUser: false ); break; + case 0xFE: + case 12: + // 管理员已满 + showToast('管理员已满'.tr); + Get.close(1); + break; default: //失败 state.ifAddState.value = false; @@ -111,6 +117,7 @@ class AddPalmLogic extends BaseGetXController { Get.close(1); break; case 0xFE: + case 12: // 管理员已满 showToast('管理员已满'.tr); Get.close(1); diff --git a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart index 04059392..33b2f2f7 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart @@ -152,6 +152,13 @@ class PasswordKeyDetailLogic extends BaseGetXController { final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); + int startTime = 0; + int endTime = 0; + if (state.itemData.value.keyboardPwdType != 2) { + startTime = state.itemData.value.startDate! ~/ 1000; + endTime = state.itemData.value.endDate! ~/ 1000; + } + IoSenderManage.senderCustomPasswordsCommand( keyID: state.itemData.value.keyboardPwdId!.toString(), userID: await Storage.getUid(), @@ -162,8 +169,8 @@ class PasswordKeyDetailLogic extends BaseGetXController { ? (state.isDeletPasswordKey.value == true ? 2 : 1) : 3, isAdmin: state.isAdministrator.value == true ? 1 : 0, - startTime: state.itemData.value.startDate! ~/ 1000, - endTime: state.itemData.value.endDate! ~/ 1000, + startTime: startTime, + endTime: endTime, needAuthor: 1, isBeforeAddUser: false, signKey: signKeyDataList, diff --git a/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart b/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart index 7916fd7e..35d5a10e 100644 --- a/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart +++ b/lib/main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_logic.dart @@ -90,6 +90,13 @@ class AddRemoteControlLogic extends BaseGetXController{ isBeforeAddUser: false ); break; + case 0xFE: + case 12: + // 管理员已满 + showToast('管理员已满'.tr); + state.ifAddState.value = false; + Get.close(1); + break; default: //失败 state.ifAddState.value = false; @@ -110,6 +117,7 @@ class AddRemoteControlLogic extends BaseGetXController{ Get.close(1); break; case 0xFE: + case 0x12: // 管理员已满 showToast('管理员已满'.tr); Get.close(1); diff --git a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index 05b499f0..75d52cf4 100755 --- a/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -449,50 +449,6 @@ class NearbyLockLogic extends BaseGetXController { } } - /// 判断 128-bit UUID 是否已配对 - bool isPaired128Bit(String serviceUuid) { - if (serviceUuid.length != 36) return false; // 确保是 128-bit UUID - try { - String status = serviceUuid.substring(30, 32); // 获取第 31 和 32 位 - return status == '01'; // '01' 表示已配对 - } catch (e) { - return false; // 如果索引越界或其他错误,返回 false - } - } - - /// 判断 128-bit UUID 是否休眠 - bool isSleeping128Bit(String serviceUuid) { - if (serviceUuid.length != 36) return false; // 确保是 128-bit UUID - try { - String status = serviceUuid.substring(32, 34); // 获取第 33 和 34 位 - return status == '00'; // '00' 表示休眠 - } catch (e) { - return false; // 如果索引越界或其他错误,返回 false - } - } - - /// 判断 32-bit UUID 是否已配对 - bool isPaired32Bit(String serviceUuid) { - if (serviceUuid.length != 8) return false; // 确保是 32-bit UUID - try { - String status = serviceUuid.substring(3, 5); // 获取第 4 和 5 位 - return status == '01'; // '01' 表示已配对 - } catch (e) { - return false; // 如果索引越界或其他错误,返回 false - } - } - - /// 判断 32-bit UUID 是否休眠 - bool isSleeping32Bit(String serviceUuid) { - if (serviceUuid.length != 8) return false; // 确保是 32-bit UUID - try { - String status = serviceUuid.substring(5, 7); // 获取第 6 和 7 位 - return status == '00'; // '00' 表示休眠 - } catch (e) { - return false; // 如果索引越界或其他错误,返回 false - } - } - void stopScanBlueList() { BlueManage().disconnect(); BlueManage().stopScan(); diff --git a/lib/talk/starChart/handle/other/talk_data_repository.dart b/lib/talk/starChart/handle/other/talk_data_repository.dart index 864aa4aa..062835cb 100644 --- a/lib/talk/starChart/handle/other/talk_data_repository.dart +++ b/lib/talk/starChart/handle/other/talk_data_repository.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart'; class TalkDataRepository { - // 创建一个私有的构造函数,防止外部创建实例 TalkDataRepository._() { _talkDataStreamController = StreamController.broadcast( onListen: () { @@ -11,47 +10,26 @@ class TalkDataRepository { onCancel: () { _isListening = false; }, - sync: false, // 异步模式 + sync: false, // 改为同步模式以提高实时性 ); } - // 使用 _instance 来保存单例对象 static final TalkDataRepository _instance = TalkDataRepository._(); - // 提供一个静态方法来获取单例实例 static TalkDataRepository get instance => _instance; - // 创建一个 StreamController late final StreamController _talkDataStreamController; - bool _isListening = false; - // 用于存储数据的缓冲区 - final List _buffer = []; + // 直接返回原始流,不做转换 + Stream get talkDataStream => _talkDataStreamController.stream; - // 提供一个方法来获取 Stream - Stream get talkDataStream => - _talkDataStreamController.stream.transform( - StreamTransformer.fromHandlers( - handleData: (TalkData data, EventSink sink) { - // 限制缓冲区大小为 100 - if (_buffer.length >= 100) { - _buffer.removeAt(0); // 丢弃最旧的数据 - } - _buffer.add(data); - sink.add(data); - }, - ), - ); - - // 提供一个方法来添加 TalkData 到 Stream void addTalkData(TalkData talkData) { if (_isListening) { _talkDataStreamController.add(talkData); } } - // 提供一个方法来关闭 StreamController void dispose() { _talkDataStreamController.close(); } diff --git a/lib/talk/starChart/star_chart_manage.dart b/lib/talk/starChart/star_chart_manage.dart index 7f60fc25..0e0e9eb8 100644 --- a/lib/talk/starChart/star_chart_manage.dart +++ b/lib/talk/starChart/star_chart_manage.dart @@ -595,27 +595,31 @@ class StartChartManage { // 发送拒绝接听消息 void startTalkRejectMessageTimer() async { - talkRejectTimer ??= Timer.periodic( - Duration(seconds: _defaultIntervalTime), - (Timer timer) async { - _sendTalkRejectMessage(); - }, - ); + try { + talkRejectTimer ??= Timer.periodic( + Duration(seconds: _defaultIntervalTime), + (Timer timer) async { + _sendTalkRejectMessage(); + }, + ); + } catch (e) { + AppLog.log("startTalkRejectMessageTimer e:${e}"); + } finally { + // 设置状态为拒绝 + StartChartTalkStatus.instance.setRejected(); + // 停止播放铃声 + AudioPlayerManager().stopRingtone(); + // 停止发送通话保持消息、通话预期数据请求 + stopTalkExpectMessageTimer(); + stopTalkPingMessageTimer(); + stopCallRequestMessageTimer(); + stopSendingRbcuInfoMessages(); + stopSendingRbcuProBeMessages(); + // 取消定时器 - // 设置状态为拒绝 - StartChartTalkStatus.instance.setRejected(); - // 停止播放铃声 - AudioPlayerManager().stopRingtone(); - // 停止发送通话保持消息、通话预期数据请求 - stopTalkExpectMessageTimer(); - stopTalkPingMessageTimer(); - stopCallRequestMessageTimer(); - stopSendingRbcuInfoMessages(); - stopSendingRbcuProBeMessages(); - // 取消定时器 - - talkePingOverTimeTimerManager.cancel(); - talkDataOverTimeTimerManager.cancel(); + talkePingOverTimeTimerManager.cancel(); + talkDataOverTimeTimerManager.cancel(); + } } // 发送期望接受消息 diff --git a/lib/talk/starChart/views/talkView/talk_view_logic.dart b/lib/talk/starChart/views/talkView/talk_view_logic.dart index 05d0636c..779e44e9 100644 --- a/lib/talk/starChart/views/talkView/talk_view_logic.dart +++ b/lib/talk/starChart/views/talkView/talk_view_logic.dart @@ -38,8 +38,8 @@ class TalkViewLogic extends BaseGetXController { final LockDetailState lockDetailState = Get.put(LockDetailLogic()).state; final int minBufferSize = 2; // 最小缓冲2帧,约166ms - final int maxBufferSize = 8; // 最大缓冲8帧,约666ms - int bufferSize = 3; // 初始化为默认大小 + final int maxBufferSize = 20; // 最大缓冲8帧,约666ms + int bufferSize = 8; // 初始化为默认大小 // 修改音频相关的成员变量 final int minAudioBufferSize = 1; // 音频最小缓冲1帧 final int maxAudioBufferSize = 3; // 音频最大缓冲3帧 @@ -184,20 +184,18 @@ class TalkViewLogic extends BaseGetXController { state.listData.value = Uint8List.fromList(oldestFrame.content); state.videoBuffer.removeAt(oldestIndex); // 移除已播放的帧 - // 更新帧率计算 - _frameCount++; - final currentTime = DateTime.now().millisecondsSinceEpoch; - final elapsed = currentTime - _lastFpsUpdateTime; + // // 更新帧率计算 + // _frameCount++; + // final currentTime = DateTime.now().millisecondsSinceEpoch; + // final elapsed = currentTime - _lastFpsUpdateTime; + // + // if (elapsed >= 1000) { + // // 每秒更新一次 + // state.fps.value = (_frameCount * 1000 / elapsed).round(); + // _frameCount = 0; + // _lastFpsUpdateTime = currentTime; + // } - if (elapsed >= 1000) { - // 每秒更新一次 - state.fps.value = (_frameCount * 1000 / elapsed).round(); - _frameCount = 0; - _lastFpsUpdateTime = currentTime; - } - // AppLog.log('🎬 播放帧 - 缓冲区剩余: ${state.videoBuffer.length}/${bufferSize}, ' - // '播放延迟: ${currentTime - oldestFrame.durationMs}ms, ' - // '帧时间戳: ${oldestFrame.durationMs}'); } else { // AppLog.log('⚠️ 帧未找到缓存 - Key: $cacheKey'); state.videoBuffer.removeAt(oldestIndex); // 移除无法播放的帧 @@ -499,6 +497,7 @@ class TalkViewLogic extends BaseGetXController { _initAudioRecorder(); requestPermissions(); + } @override