From 88db0e850b5275adf56a0266d12be64e41b70cf3 Mon Sep 17 00:00:00 2001 From: liyi Date: Fri, 15 Aug 2025 13:51:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4ios=E6=94=B6=E5=88=B0?= =?UTF-8?q?=E5=AF=B9=E8=AE=B2=E5=90=8E=E6=89=BE=E5=88=B0=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E7=9A=84=E6=B6=88=E6=81=AF=E5=B9=B6=E8=AE=BE=E7=BD=AE=E4=B8=BA?= =?UTF-8?q?=E5=B7=B2=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/main.dart | 22 +---------- .../lockMian/entity/lockListInfo_entity.dart | 25 ++++++++++++ .../messageDetail/messageDetail_logic.dart | 2 +- .../messageList/messageList_entity.dart | 26 ++++++++++++- .../messageList/messageList_logic.dart | 5 +++ lib/network/api_provider.dart | 3 +- .../handle/impl/udp_talk_accept_handler.dart | 21 ++++++++++ .../status/appLifecycle_observer.dart | 38 +++++++++++++++++++ lib/tools/eventBusEventManage.dart | 7 ++++ 9 files changed, 126 insertions(+), 23 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 3953f687..6a3963db 100755 --- a/lib/main.dart +++ b/lib/main.dart @@ -62,10 +62,8 @@ FutureOr main() async { } }); - // //ToDo: 增加对讲调试、正式可删除 - // runApp(MultiProvider(providers: [ - // ChangeNotifierProvider(create: (_) => DebugInfoModel()), - // ], child: MyApp(isLogin: isLogin))); + // 如果是ios则初始化获取到voip token + // 上报时判断是否属于国内用户,国内用户不上报token 既不触发callkit if (Platform.isIOS) { CallKitHandler.setupListener(); String? token = await CallKitHandler.getVoipToken(); @@ -111,20 +109,4 @@ Future privacySDKInitialization() async { await jpushProvider.initJPushService(); NotificationService().init(); // 初始化通知服务 - // /// 检查ip如果属于国内才进行初始化 - // final CheckIPEntity entity = await ApiRepository.to.checkIpAction(ip: ''); - // if (entity.errorCode!.codeIsSuccessful) { - // String currentLanguage = - // CurrentLocaleTool.getCurrentLocaleString(); // 当前选择语言 - // // 判断如果ip是国内的且选的是中文才初始化一键登录 - // if (entity.data!.abbreviation?.toLowerCase() == 'cn' && - // currentLanguage == 'zh_CN') { - // // 初始化一键登录服务 - // final StarLockLoginLogic loginLogic = Get.put(StarLockLoginLogic()); - // await JverifyOneClickLoginManage(); - // loginLogic.state.isCheckVerifyEnable.value = - // await JverifyOneClickLoginManage().checkVerifyEnable(); - // eventBus.fire(AgreePrivacyAgreement()); - // } - // } } diff --git a/lib/main/lockMian/entity/lockListInfo_entity.dart b/lib/main/lockMian/entity/lockListInfo_entity.dart index 28c48457..91978c59 100755 --- a/lib/main/lockMian/entity/lockListInfo_entity.dart +++ b/lib/main/lockMian/entity/lockListInfo_entity.dart @@ -297,6 +297,11 @@ class LockListInfoItemEntity { LockListInfoItemEntity copy() { return LockListInfoItemEntity.fromJson(toJson()); } + + @override + String toString() { + return 'LockListInfoItemEntity{keyId: $keyId, lockId: $lockId, lockName: $lockName, lockAlias: $lockAlias, electricQuantity: $electricQuantity, fwVersion: $fwVersion, hwVersion: $hwVersion, keyType: $keyType, passageMode: $passageMode, userType: $userType, startDate: $startDate, endDate: $endDate, weekDays: $weekDays, remoteEnable: $remoteEnable, faceAuthentication: $faceAuthentication, lastFaceValidateTime: $lastFaceValidateTime, nextFaceValidateTime: $nextFaceValidateTime, keyRight: $keyRight, keyStatus: $keyStatus, isLockOwner: $isLockOwner, sendDate: $sendDate, lockUserNo: $lockUserNo, senderUserId: $senderUserId, electricQuantityDate: $electricQuantityDate, electricQuantityStandby: $electricQuantityStandby, isOnlyManageSelf: $isOnlyManageSelf, restoreCount: $restoreCount, model: $model, vendor: $vendor, bluetooth: $bluetooth, lockFeature: $lockFeature, lockSetting: $lockSetting, hasGateway: $hasGateway, appUnlockOnline: $appUnlockOnline, mac: $mac, initUserNo: $initUserNo, updateDate: $updateDate, network: $network}'; + } } class NetworkInfo { @@ -323,6 +328,11 @@ class NetworkInfo { data['isOnline'] = isOnline; return data; } + + @override + String toString() { + return 'NetworkInfo{peerId: $peerId, wifiName: $wifiName, isOnline: $isOnline}'; + } } class Bluetooth { @@ -356,6 +366,11 @@ class Bluetooth { data['signKey'] = signKey; return data; } + + @override + String toString() { + return 'Bluetooth{bluetoothDeviceId: $bluetoothDeviceId, bluetoothDeviceName: $bluetoothDeviceName, publicKey: $publicKey, privateKey: $privateKey, signKey: $signKey}'; + } } class LockFeature { @@ -442,6 +457,11 @@ class LockFeature { data['isMJpeg'] = isMJpeg; return data; } + + @override + String toString() { + return 'LockFeature{password: $password, passwordIssue: $passwordIssue, icCard: $icCard, fingerprint: $fingerprint, fingerVein: $fingerVein, palmVein: $palmVein, isSupportIris: $isSupportIris, d3Face: $d3Face, bluetoothRemoteControl: $bluetoothRemoteControl, videoIntercom: $videoIntercom, isSupportCatEye: $isSupportCatEye, isSupportBackupBattery: $isSupportBackupBattery, isNoSupportedBlueBroadcast: $isNoSupportedBlueBroadcast, wifiLockType: $wifiLockType, wifi: $wifi, isH264: $isH264, isH265: $isH265, isMJpeg: $isMJpeg}'; + } } class LockSetting { @@ -486,6 +506,11 @@ class LockSetting { } return data; } + + @override + String toString() { + return 'LockSetting{attendance: $attendance, appUnlockOnline: $appUnlockOnline, remoteUnlock: $remoteUnlock, catEyeConfig: $catEyeConfig}'; + } } // 定义 CatEyeConfig 类 diff --git a/lib/mine/message/messageDetail/messageDetail_logic.dart b/lib/mine/message/messageDetail/messageDetail_logic.dart index 8614f6e2..1f8b8cc9 100755 --- a/lib/mine/message/messageDetail/messageDetail_logic.dart +++ b/lib/mine/message/messageDetail/messageDetail_logic.dart @@ -8,7 +8,7 @@ import 'messageDetail_state.dart'; class MessageDetailLogic extends BaseGetXController { final MessageDetailState state = MessageDetailState(); - //请求密码钥匙列表 + // 将消息设置为已读 Future readMessageDataRequest() async { final MessageListEntity entity = await ApiRepository.to.readMessageLoadData(messageId:state.itemData.value.id!); if (entity.errorCode!.codeIsSuccessful) { diff --git a/lib/mine/message/messageList/messageList_entity.dart b/lib/mine/message/messageList/messageList_entity.dart index f768625d..e79cf614 100755 --- a/lib/mine/message/messageList/messageList_entity.dart +++ b/lib/mine/message/messageList/messageList_entity.dart @@ -24,14 +24,22 @@ class MessageListEntity { } return data; } + + @override + String toString() { + return 'MessageListEntity{errorCode: $errorCode, description: $description, errorMsg: $errorMsg, data: $data}'; + } } class Data { List? list; int? pageNo; int? pageSize; + int? total; + int? readCount; + int? unreadCount; - Data({this.list, this.pageNo, this.pageSize}); + Data({this.list, this.pageNo, this.pageSize, this.total,this.readCount, this.unreadCount}); Data.fromJson(Map json) { if (json['list'] != null) { @@ -42,6 +50,9 @@ class Data { } pageNo = json['pageNo']; pageSize = json['pageSize']; + total = json['total']; + readCount = json['readCount']; + unreadCount = json['unreadCount']; } Map toJson() { @@ -51,8 +62,16 @@ class Data { } data['pageNo'] = pageNo; data['pageSize'] = pageSize; + data['total'] = total; + data['readCount'] = readCount; + data['unreadCount'] = unreadCount; return data; } + + @override + String toString() { + return 'Data{list: $list, pageNo: $pageNo, pageSize: $pageSize, total: $total, readCount: $readCount, unreadCount: $unreadCount}'; + } } class MessageItemEntity { @@ -78,4 +97,9 @@ class MessageItemEntity { data['readAt'] = readAt; return data; } + + @override + String toString() { + return 'MessageItemEntity{id: $id, data: $data, createdAt: $createdAt, readAt: $readAt}'; + } } diff --git a/lib/mine/message/messageList/messageList_logic.dart b/lib/mine/message/messageList/messageList_logic.dart index 38ca4975..1fbdabed 100755 --- a/lib/mine/message/messageList/messageList_logic.dart +++ b/lib/mine/message/messageList/messageList_logic.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter_app_badger/flutter_app_badger.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../network/api_repository.dart'; import '../../../tools/eventBusEventManage.dart'; @@ -18,6 +19,10 @@ class MessageListLogic extends BaseGetXController { final MessageListEntity entity = await ApiRepository.to .messageListLoadData(pageNo: pageNo.toString(), pageSize: pageSize); if (entity.errorCode!.codeIsSuccessful) { + AppLog.log('消息列表数据请求成功:${entity.data!.total}'); + // 设置角标(直接设置一个数值) + await FlutterAppBadger.updateBadgeCount(entity.data!.unreadCount!); + if (pageNo == 1) { state.itemDataList.value = entity.data!.list!; pageNo++; diff --git a/lib/network/api_provider.dart b/lib/network/api_provider.dart index af23be71..69de7cb3 100755 --- a/lib/network/api_provider.dart +++ b/lib/network/api_provider.dart @@ -2169,7 +2169,8 @@ class ApiProvider extends BaseProvider { readMessageURL.toUrl, jsonEncode({ 'id': messageId, - })); + }), + isUnShowLoading: true); // 删除消息 Future deletMessageLoadData(String messageId) => post( diff --git a/lib/talk/starChart/handle/impl/udp_talk_accept_handler.dart b/lib/talk/starChart/handle/impl/udp_talk_accept_handler.dart index 35389a70..f02538ef 100644 --- a/lib/talk/starChart/handle/impl/udp_talk_accept_handler.dart +++ b/lib/talk/starChart/handle/impl/udp_talk_accept_handler.dart @@ -4,6 +4,7 @@ import 'dart:typed_data'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_pcm_sound/flutter_pcm_sound.dart'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart'; import 'package:star_lock/talk/starChart/constant/message_type_constant.dart'; import 'package:star_lock/talk/starChart/constant/talk_status.dart'; @@ -15,6 +16,7 @@ import 'package:star_lock/talk/starChart/proto/generic.pb.dart'; import 'package:star_lock/talk/starChart/proto/talk_accept.pb.dart'; import 'package:star_lock/talk/starChart/proto/talk_expect.pb.dart'; import 'package:star_lock/tools/commonDataManage.dart'; +import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/storage.dart'; import '../../star_chart_manage.dart'; @@ -43,6 +45,25 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle // 同意接听之后,停止对讲请求超时监听定时器 talkeRequestOverTimeTimerManager.renew(); talkeRequestOverTimeTimerManager.cancel(); + + // 同意接听之后代表已读消息 + // 需要把对应的消息设置为已读 + AppLog.log('msg:${scpMessage}'); + AppLog.log('msg:${startChartManage.lockListPeerId}'); + + // 锁发过来的id + final fromPeerId = scpMessage.FromPeerId; + if (fromPeerId != null && fromPeerId != '') { + startChartManage.lockListPeerId.forEach((element) { + if (element != null && + element.network != null && + element.network!.peerId == fromPeerId) { + // 找到了对应的锁,设置为已读 + eventBus.fire(ReadTalkMessageRefreshUI(element.lockName!)); + } + }); + } + // 启动发送rbcuInfo数据 // startChartManage.startSendingRbcuInfoMessages( // ToPeerId: startChartManage.lockPeerId); diff --git a/lib/talk/starChart/status/appLifecycle_observer.dart b/lib/talk/starChart/status/appLifecycle_observer.dart index 03a356d1..678c04c6 100644 --- a/lib/talk/starChart/status/appLifecycle_observer.dart +++ b/lib/talk/starChart/status/appLifecycle_observer.dart @@ -1,11 +1,45 @@ +import 'dart:async'; + import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/message/messageList/messageList_entity.dart'; +import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/network/start_chart_api.dart'; import 'package:star_lock/talk/starChart/constant/talk_status.dart'; import 'package:star_lock/talk/starChart/star_chart_manage.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/eventBusEventManage.dart'; import 'package:star_lock/tools/storage.dart'; class AppLifecycleObserver extends WidgetsBindingObserver { + // 刷新消息列表 + StreamSubscription? _readMessageRefreshUIEvent; + + void _readMessageRefreshUIAction() { + // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus + _readMessageRefreshUIEvent = + eventBus.on().listen((event) async { + // 查询第一条消息 + final MessageListEntity entity = await ApiRepository.to + .messageListLoadData(pageNo: '1', pageSize: '1'); + if (entity.errorCode!.codeIsSuccessful) { + final lockName = event.lockName; + if (lockName != null && lockName.isNotEmpty) { + final readAt = entity.data?.list?.first.readAt == 0; + final data = entity.data?.list?.first.data; + if (readAt && data != null && data.contains(lockName)) { + // 如果是未读且饱含了锁名,就将这个消息设置为已读 + final entity2 = await ApiRepository.to + .readMessageLoadData(messageId: entity.data!.list!.first.id!); + if (entity2.errorCode!.codeIsSuccessful) { + eventBus.fire(ReadMessageRefreshUI()); + } + } + } + } + }); + } + @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); @@ -37,6 +71,7 @@ class AppLifecycleObserver extends WidgetsBindingObserver { Get.back(); } StartChartManage().destruction(); + _readMessageRefreshUIEvent?.cancel(); } void onAppResumed() async { @@ -52,6 +87,9 @@ class AppLifecycleObserver extends WidgetsBindingObserver { StartChartApi.to.startChartHost = loginData!.starchart!.scdUrl ?? StartChartApi.to.startChartHost; } + + // 监听对讲消息处理角标已读 + _readMessageRefreshUIAction(); print('App has resumed to the foreground.'); } diff --git a/lib/tools/eventBusEventManage.dart b/lib/tools/eventBusEventManage.dart index 4c4fbb3d..37511292 100755 --- a/lib/tools/eventBusEventManage.dart +++ b/lib/tools/eventBusEventManage.dart @@ -131,6 +131,13 @@ class ReadMessageRefreshUI { ReadMessageRefreshUI(); } +/// 刷新接收到对讲消息后将消息设置为已读 +class ReadTalkMessageRefreshUI { + ReadTalkMessageRefreshUI(this.lockName); + + String lockName; +} + /// 刷新电子钥匙列表 class ElectronicKeyListRefreshUI { ElectronicKeyListRefreshUI();