Merge branch 'develop_liyi' into 'canary_release'
Develop liyi See merge request StarlockTeam/app-starlock!19
This commit is contained in:
commit
e37415789d
@ -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<AgreePrivacyAgreement>()
|
||||
.listen((AgreePrivacyAgreement event) async {
|
||||
await JverifyOneClickLoginManage();
|
||||
@ -194,6 +198,8 @@ class StarLockLoginLogic extends BaseGetXController {
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
// 取消事件监听
|
||||
_agreePrivacySubscription.cancel();
|
||||
state.onClose();
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
@ -106,7 +106,6 @@ Future<void> privacySDKInitialization() async {
|
||||
// 初始化一键登录服务
|
||||
final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic());
|
||||
await JverifyOneClickLoginManage();
|
||||
loginLogic.oneClickLoginAction();
|
||||
loginLogic.state.isCheckVerifyEnable.value =
|
||||
await JverifyOneClickLoginManage().checkVerifyEnable();
|
||||
eventBus.fire(AgreePrivacyAgreement());
|
||||
|
||||
@ -80,7 +80,7 @@ class AddICCardLogic extends BaseGetXController {
|
||||
final List<int> token = reply.data.sublist(5, 9);
|
||||
final List<String> 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);
|
||||
|
||||
@ -28,6 +28,7 @@ class CardListLogic extends BaseGetXController {
|
||||
|
||||
// 获取解析后的数据
|
||||
late StreamSubscription<Reply> _replySubscription;
|
||||
|
||||
void _initReplySubscription() {
|
||||
_replySubscription =
|
||||
EventBusManager().eventBus!.on<Reply>().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<OtherTypeRefreshListEvent>()
|
||||
@ -240,6 +250,7 @@ class CardListLogic extends BaseGetXController {
|
||||
|
||||
_initRefreshAction();
|
||||
}
|
||||
await getICCardListData(isRefresh: true);
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@ -31,24 +31,24 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
|
||||
final CardListLogic logic = Get.put(CardListLogic());
|
||||
final CardListState state = Get.find<CardListLogic>().state;
|
||||
|
||||
Future<void> 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<void> 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<CardListPage> with RouteAware {
|
||||
),
|
||||
body: EasyRefreshTool(
|
||||
onRefresh: () {
|
||||
getHttpData(isRefresh: true);
|
||||
logic.getICCardListData(isRefresh: true);
|
||||
},
|
||||
onLoad: () {
|
||||
getHttpData(isRefresh: false);
|
||||
logic.getICCardListData(isRefresh: false);
|
||||
},
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
KeySearchWidget(
|
||||
editingController: state.searchController,
|
||||
onSubmittedAction: () {
|
||||
getHttpData(isRefresh: true);
|
||||
logic.getICCardListData(isRefresh: true);
|
||||
},
|
||||
),
|
||||
SizedBox(height: 20.h),
|
||||
@ -115,10 +115,10 @@ class _CardListPageState extends State<CardListPage> 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<CardListPage> with RouteAware {
|
||||
arguments: <String, FingerprintItemData>{
|
||||
'fingerprintItemData': fingerprintItemData,
|
||||
})!
|
||||
.then((value) => getHttpData(isRefresh: true));
|
||||
.then((value) => logic.getICCardListData(isRefresh: true));
|
||||
// if (data != null) {
|
||||
// getHttpData(isRefresh: true);
|
||||
// logic.getICCardListData(isRefresh: true);
|
||||
// }
|
||||
}),
|
||||
);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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:
|
||||
// 用户已满
|
||||
|
||||
@ -404,8 +404,8 @@ class FingerprintListLogic extends BaseGetXController {
|
||||
void _initRefreshAction() {
|
||||
_teamEvent = eventBus
|
||||
.on<OtherTypeRefreshListEvent>()
|
||||
.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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -814,7 +814,7 @@ class LockDetailLogic extends BaseGetXController {
|
||||
}
|
||||
});
|
||||
|
||||
eventBus
|
||||
state.DetailLockInfo = eventBus
|
||||
.on<PassCurrentLockInformationEvent>()
|
||||
.listen((PassCurrentLockInformationEvent event) {
|
||||
if (event.lockSetInfoData.lockSettingInfo != null &&
|
||||
@ -839,7 +839,7 @@ class LockDetailLogic extends BaseGetXController {
|
||||
}
|
||||
});
|
||||
|
||||
eventBus
|
||||
state.SuccessfulDistributionNetworkEvent = eventBus
|
||||
.on<SuccessfulDistributionNetwork>()
|
||||
.listen((SuccessfulDistributionNetwork event) {
|
||||
// 配网成功获取一下配网信息
|
||||
|
||||
@ -14,6 +14,8 @@ class LockDetailState {
|
||||
late StreamSubscription<Reply> replySubscription;
|
||||
StreamSubscription? lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent;
|
||||
StreamSubscription? LockSetChangeSetRefreshLockDetailWithTypeSubscription;
|
||||
StreamSubscription? DetailLockInfo;
|
||||
StreamSubscription? SuccessfulDistributionNetworkEvent;
|
||||
|
||||
String lockNetToken = '0';
|
||||
int differentialTime = 0;// 服务器时间与本地时间差值
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -152,6 +152,13 @@ class PasswordKeyDetailLogic extends BaseGetXController {
|
||||
final List<String>? token = await Storage.getStringList(saveBlueToken);
|
||||
final List<int> 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,
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -2,7 +2,6 @@ import 'dart:async';
|
||||
import 'package:star_lock/talk/starChart/proto/talk_data.pb.dart';
|
||||
|
||||
class TalkDataRepository {
|
||||
// 创建一个私有的构造函数,防止外部创建实例
|
||||
TalkDataRepository._() {
|
||||
_talkDataStreamController = StreamController<TalkData>.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<TalkData> _talkDataStreamController;
|
||||
|
||||
bool _isListening = false;
|
||||
|
||||
// 用于存储数据的缓冲区
|
||||
final List<TalkData> _buffer = [];
|
||||
// 直接返回原始流,不做转换
|
||||
Stream<TalkData> get talkDataStream => _talkDataStreamController.stream;
|
||||
|
||||
// 提供一个方法来获取 Stream
|
||||
Stream<TalkData> get talkDataStream =>
|
||||
_talkDataStreamController.stream.transform(
|
||||
StreamTransformer<TalkData, TalkData>.fromHandlers(
|
||||
handleData: (TalkData data, EventSink<TalkData> 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();
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
// 发送期望接受消息
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user