diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart index 8efa1e76..e02602e2 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart @@ -1,6 +1,7 @@ - import 'dart:async'; +import 'package:flutter/services.dart'; + import '../../../../tools/baseGetXController.dart'; import '../../../../tools/eventBusEventManage.dart'; import 'lockMonitoring_state.dart'; @@ -12,8 +13,14 @@ class LockMonitoringLogic extends BaseGetXController { StreamSubscription? _getTVDataRefreshUIEvent; void _getTVDataRefreshUIAction() { // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus - _getTVDataRefreshUIEvent = eventBus.on().listen((event) { - state.listData.value = event.tvList; + _getTVDataRefreshUIEvent = + eventBus.on().listen((event) { + if (event.tvList.isNotEmpty) { + // 预加载图片数据 + Uint8List imageData = Uint8List.fromList(event.tvList); + // 更新状态 + state.listData.value = imageData; + } }); } @@ -30,7 +37,6 @@ class LockMonitoringLogic extends BaseGetXController { void onInit() { // TODO: implement onInit super.onInit(); - } @override @@ -39,5 +45,4 @@ class LockMonitoringLogic extends BaseGetXController { print("锁详情界面销毁了"); _getTVDataRefreshUIEvent!.cancel(); } - -} \ No newline at end of file +} diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart index 4bb5d31c..6bf7186b 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -23,63 +25,60 @@ class _LockMonitoringPageState extends State { return SizedBox( width: 1.sw, height: 1.sh, - // color: Colors.transparent, child: Stack( - // alignment: Alignment.bottomCenter, - children: [ - // state.listData.value.isEmpty ? Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sh, fit: BoxFit.cover) : - Obx(() => - state.listData.value.isEmpty - ? Container(color: Colors.red) - :Image.memory( - Uint8List.fromList(state.listData.value), - width: 1.sw, - height: 1.sh, - fit: BoxFit.cover, - )), - Positioned( - top: ScreenUtil().statusBarHeight + 30.h, - child: Row(children: [ - SizedBox(width: 30.w), - GestureDetector( - onTap: () { - Get.back(); - }, - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(25.h)), - padding: EdgeInsets.all(10.w), - child: Image( - width: 40.w, - height: 40.w, - image: const AssetImage("images/icon_left_black.png"), - ), - ), + children: [ + Obx(() => state.listData.value.isEmpty + ? Container(color: Colors.transparent) + : Image.memory( + state.listData.value, + gaplessPlayback: true, + width: 1.sw, + height: 1.sh, + fit: BoxFit.cover, + )), + Positioned( + top: ScreenUtil().statusBarHeight + 30.h, + child: Row(children: [ + SizedBox(width: 30.w), + GestureDetector( + onTap: () { + Get.back(); + }, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(25.h)), + padding: EdgeInsets.all(10.w), + child: Image( + width: 40.w, + height: 40.w, + image: const AssetImage("images/icon_left_black.png"), ), - ]), + ), ), - Positioned( - bottom: 10.w, - child: Container( - width: 1.sw - 30.w * 2, - // height: 300.h, - margin: EdgeInsets.all(30.w), - decoration: BoxDecoration( - color: const Color(0xC83C3F41), - borderRadius: BorderRadius.circular(20.h)), - child: Column( - children: [ - SizedBox(height: 20.h), - bottomTopBtnWidget(), - SizedBox(height: 20.h), - bottomBottomBtnWidget(), - SizedBox(height: 20.h), - ], - ), - )) - ], + ]), ), + Positioned( + bottom: 10.w, + child: Container( + width: 1.sw - 30.w * 2, + // height: 300.h, + margin: EdgeInsets.all(30.w), + decoration: BoxDecoration( + color: const Color(0xC83C3F41), + borderRadius: BorderRadius.circular(20.h)), + child: Column( + children: [ + SizedBox(height: 20.h), + bottomTopBtnWidget(), + SizedBox(height: 20.h), + bottomBottomBtnWidget(), + SizedBox(height: 20.h), + ], + ), + )) + ], + ), ); } diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart index ed1135ca..977559ef 100644 --- a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart @@ -5,9 +5,9 @@ import 'package:get/get.dart'; class LockMonitoringState { var isOpenVoice = false.obs; - var listData = [].obs; + var listData = Uint8List(0).obs; - Uint8List imageData = Uint8List.fromList([ + Uint8List imageData = Uint8List.fromList([ 255, 216, 255, diff --git a/star_lock/lib/talk/call/callTalk.dart b/star_lock/lib/talk/call/callTalk.dart index f09379aa..ceb81f90 100644 --- a/star_lock/lib/talk/call/callTalk.dart +++ b/star_lock/lib/talk/call/callTalk.dart @@ -1,6 +1,9 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_sound/flutter_sound.dart'; +import 'package:get/get.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:star_lock/appRouters.dart'; import 'package:star_lock/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart'; import 'package:star_lock/talk/call/g711Decoder.dart'; import 'package:star_lock/talk/call/iFrameInfo.dart'; @@ -21,7 +24,7 @@ class CallTalk { int status = 0; // 假设有这个成员变量 IframeInfo? iframe; // 假设有这个成员变量 var growableList; - LockMonitoringPage callOut = const LockMonitoringPage(); + bool getFirstFrame = false; //是否得到了第一帧 final FlutterSoundPlayer _audioPlayer = FlutterSoundPlayer(); CallTalk._init() { @@ -107,6 +110,13 @@ class CallTalk { if (iframe!.bagNum == iframe!.bagReceive) { print( '播放第${iframe!.iframeIndex}帧 一帧图片的hexStringData: ${Uint8List.fromList(growableList)}'); + + //判断第一帧是否接收到 + if (iframe!.iframeIndex == 0) { + getFirstFrame = true; + eventBus.fire(GetFirstFrameGoPush(getFirstFrame)); + } + eventBus.fire(GetTVDataRefreshUI(growableList)); } } diff --git a/star_lock/lib/talk/udp/udp_help.dart b/star_lock/lib/talk/udp/udp_help.dart index c6bea328..6b47e50b 100644 --- a/star_lock/lib/talk/udp/udp_help.dart +++ b/star_lock/lib/talk/udp/udp_help.dart @@ -1,5 +1,3 @@ - - import 'dart:async'; import 'dart:io'; @@ -10,32 +8,33 @@ import '../../tools/storage.dart'; import 'udp_manage.dart'; import 'udp_senderManage.dart'; -class UdpHelp{ - +class UdpHelp { openUDP() async { // 从服务器获取ip跟端口 var entity = await ApiRepository.to.getWifiLockServiceIpAndPort(); - if(entity.errorCode! == 0){ + if (entity.errorCode! == 0) { UDPManage(); // UDPManage().initUdp(); // UDPManage().host = entity.data!.serviceList![0].serviceIp!; // UDPManage().port = int.parse(entity.data!.serviceList![0].port!); var serversList = []; - for(int i = 0; i addresses = await InternetAddress.lookup(item.serviceIp!); + } else { + List addresses = + await InternetAddress.lookup(item.serviceIp!); var itemList = addresses.first.address.split("."); for (var element in itemList) { serversList.add(int.parse(element)); } - print('Resolved google.com to address: ${addresses.first.address} serversList:${serversList}'); + print( + 'Resolved google.com to address: ${addresses.first.address} serversList:${serversList}'); } } @@ -51,9 +50,7 @@ class UdpHelp{ Future getWifiLockServiceIpAndPort() async { var entity = await ApiRepository.to.getWifiLockServiceIpAndPort(); - if(entity.errorCode! == 0){ - - } + if (entity.errorCode! == 0) {} } } diff --git a/star_lock/lib/talk/udp/udp_talkClass.dart b/star_lock/lib/talk/udp/udp_talkClass.dart index 05d0739b..cf47132b 100644 --- a/star_lock/lib/talk/udp/udp_talkClass.dart +++ b/star_lock/lib/talk/udp/udp_talkClass.dart @@ -1,28 +1,29 @@ - import 'dart:async'; import 'package:fast_gbk/fast_gbk.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:star_lock/tools/eventBusEventManage.dart'; import '../../appRouters.dart'; import '../../main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart'; import '../../tools/storage.dart'; import 'udp_manage.dart'; -class UDPTalkClass{ +class UDPTalkClass { static UDPTalkClass? _manager; - static UDPTalkClass _share(){ + static UDPTalkClass _share() { _manager ??= UDPTalkClass._init(); return _manager!; } + factory UDPTalkClass() => _share(); UDPTalkClass get manager => _share(); UDPTalkClass._init(); - var status = 0;// 0空闲 - var remoteEquid;// 手机号 + var status = 0; // 0空闲 + var remoteEquid; // 手机号 late Timer timer; // 该字段是为了判断是否跳转到接听界面 挂断或者退出接听界面要记得变更状态 var isBeCall = false; @@ -33,7 +34,7 @@ class UDPTalkClass{ // return; // } - if(status == 0){ + if (status == 0) { // 空闲 // 响铃 // [[Pub getApp] ring]; @@ -65,22 +66,36 @@ class UDPTalkClass{ data[8] = 9; UDPManage().sendData(data); }); + + // _getFirstFrameGoPushAction(); + Future.delayed(const Duration(seconds: 1), () { + // 在这里写要延迟执行的代码 + Get.toNamed(Routers.lockMonitoringPage, arguments: {"lockId": "111"}); + }); } - - Get.toNamed(Routers.lockMonitoringPage, arguments: { - "lockId": "111" - }); - }else{ + } else { // 忙 - } } + void _getFirstFrameGoPushAction() { + // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus + StreamSubscription _GetFirstFrameGoPushEvent = + eventBus.on().listen((event) { + if (event.isFirstFrame == true) { + Future.delayed(const Duration(seconds: 1), () { + // 在这里写要延迟执行的代码 + Get.toNamed(Routers.lockMonitoringPage, arguments: {"lockId": "111"}); + }); + } + }); + } + // 判断是否是call的本人 Future isCallMe(List? data) async { final loginData = await Storage.getLoginData(); print("getEquidFrombb(data, 1000):${getEquidFrombb(data, 12)}"); - if(loginData!.mobile == getEquidFrombb(data, 12)){ + if (loginData!.mobile == getEquidFrombb(data, 12)) { return true; } return false; diff --git a/star_lock/lib/tools/eventBusEventManage.dart b/star_lock/lib/tools/eventBusEventManage.dart index 7958e493..84b58165 100644 --- a/star_lock/lib/tools/eventBusEventManage.dart +++ b/star_lock/lib/tools/eventBusEventManage.dart @@ -6,58 +6,64 @@ import '../main/lockDetail/lcokSet/lockSet/lockSetInfo_entity.dart'; EventBus eventBus = EventBus(); /// 刷新锁列表数据 -class RefreshLockListInfoDataEvent{ +class RefreshLockListInfoDataEvent { RefreshLockListInfoDataEvent(); } /// 刷新考勤员工列表 -class RefreshCheckInStaffListDataEvent{ +class RefreshCheckInStaffListDataEvent { RefreshCheckInStaffListDataEvent(); } /// 传递当前锁信息 -class PassCurrentLockInformationEvent{ +class PassCurrentLockInformationEvent { LockSetInfoData lockSetInfoData; PassCurrentLockInformationEvent(this.lockSetInfoData); } /// 卡、密码、指纹修改之后刷新列表 -class OtherTypeRefreshListEvent{ +class OtherTypeRefreshListEvent { OtherTypeRefreshListEvent(); } /// 考情添加员工卡、指纹之后回调卡、指纹number -class ChickInAddStaffCardAndFingerprintBlockNumberEvent{ +class ChickInAddStaffCardAndFingerprintBlockNumberEvent { String number; ChickInAddStaffCardAndFingerprintBlockNumberEvent(this.number); } /// Uuid删除当前锁时 有可能锁被初始化了 但后台没被初始化 当打开APP的时候扫描如果未被连接就传uuid过去 判断直接删除数据 -class ScanAllDeviceFindCurrentDeviceConnectedEvent{ +class ScanAllDeviceFindCurrentDeviceConnectedEvent { String uuid; ScanAllDeviceFindCurrentDeviceConnectedEvent(this.uuid); } /// 多语言 切换之后传值到上一级界面 -class ChangeLanguageBlockLastLanguageEvent{ +class ChangeLanguageBlockLastLanguageEvent { String languageTitle; ChangeLanguageBlockLastLanguageEvent(this.languageTitle); } /// 锁分组添加或者删除锁之后刷新首页数据 -class LockGroupEditGroupLockRefreshEvent{ +class LockGroupEditGroupLockRefreshEvent { LockGroupEditGroupLockRefreshEvent(); } /// 锁设置里面开启关闭刷新锁详情 -class LockSetChangeSetRefreshLockDetailWithType{ - int type;// 0 考勤 1开锁时是否需联网 +class LockSetChangeSetRefreshLockDetailWithType { + int type; // 0 考勤 1开锁时是否需联网 int setResult; LockSetChangeSetRefreshLockDetailWithType(this.type, this.setResult); } /// 获取到视频流数据然后刷新界面 -class GetTVDataRefreshUI{ +class GetTVDataRefreshUI { List tvList; GetTVDataRefreshUI(this.tvList); -} \ No newline at end of file +} + +/// 获取到第一帧图片数据后跳转 +class GetFirstFrameGoPush { + bool isFirstFrame; + GetFirstFrameGoPush(this.isFirstFrame); +}