From c2e54553fe45d2b492de8f6949a4a26a0bd59a4a Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 22 May 2025 16:53:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=82=B9=E5=87=BB=E6=96=87?= =?UTF-8?q?=E5=AD=97=E6=92=AD=E6=94=BE=E9=9F=B3=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting_details_controller.dart | 10 ++ .../views/speaker_all_bottom_sheet.dart | 161 +++++++++++------- 2 files changed, 112 insertions(+), 59 deletions(-) diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index e894d1bf1..6a65612e2 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -29,6 +29,9 @@ class MeetingDetailsController extends GetxController RxInt currentDuration = 0.obs; + RxInt speakerAllStarttime = (-1).obs; + RxInt speakerAllEndtime = (-1).obs; + int id = 0; RxBool isLoading = true.obs; @@ -103,6 +106,13 @@ class MeetingDetailsController extends GetxController playerController.setFinishMode(finishMode: FinishMode.pause); playerController.onCurrentDurationChanged.listen((int position) { currentDuration.value = position; + if (speakerAllEndtime.value > 0) { + if (position >= speakerAllEndtime.value) { + playerController.pausePlayer(); + speakerAllStarttime.value = -1; + speakerAllEndtime.value = -1; + } + } }); if (meetingDetails.value.tasktype == 1) { List speakerList = await SqfliteApi.getMeetingSpeaker(id); diff --git a/lib/modules/meeting/views/speaker_all_bottom_sheet.dart b/lib/modules/meeting/views/speaker_all_bottom_sheet.dart index cd455a945..ecf12291e 100644 --- a/lib/modules/meeting/views/speaker_all_bottom_sheet.dart +++ b/lib/modules/meeting/views/speaker_all_bottom_sheet.dart @@ -27,9 +27,20 @@ class _SpeakerAllBottomSheetState extends State { @override void initState() { super.initState(); + _controller.playerController.pausePlayer(); + _controller.speakerAllStarttime.value = -1; + _controller.speakerAllEndtime.value = -1; _getSpeakerList(); } + @override + void dispose() { + _controller.playerController.pausePlayer(); + _controller.speakerAllStarttime.value = -1; + _controller.speakerAllEndtime.value = -1; + super.dispose(); + } + void _getSpeakerList() { _historySpeakerList = _storage.read("speaker_list") ?? []; _speakerList = List.from(_historySpeakerList); @@ -269,77 +280,109 @@ class _SpeakerAllBottomSheetState extends State { item['list'].length, (int idx) { Map data = item['list'][idx]; - return Padding( - padding: EdgeInsets.symmetric(horizontal: 10.w), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( + return Obx(() { + bool isActive = false; + if (_controller.speakerAllStarttime.value == + data['starttime'] && + _controller.speakerAllEndtime.value == + data['endtime']) { + isActive = true; + } + return GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + if (isActive) { + _controller.playerController.pausePlayer(); + _controller.speakerAllStarttime.value = -1; + _controller.speakerAllEndtime.value = -1; + } else { + _controller.speakerAllStarttime.value = + data['starttime']; + _controller.speakerAllEndtime.value = + data['endtime']; + _controller.playerController + .seekTo(data['starttime']); + _controller.playerController.startPlayer(); + } + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon( - Icons.play_circle, - color: Colors.red[400], - size: 15.w, - ), - 2.horizontalSpace, - Text( - DateUtil.formatDateMs( - data['starttime'], - format: 'HH:mm:ss', - isUtc: true, - ), - style: TextStyle( - color: Colors.grey, - fontSize: 12.sp, - ), + Row( + children: [ + Icon( + isActive + ? Icons.pause_circle + : Icons.play_circle, + color: Colors.red[400], + size: 15.w, + ), + 2.horizontalSpace, + Text( + DateUtil.formatDateMs( + data['starttime'], + format: 'HH:mm:ss', + isUtc: true, + ), + style: TextStyle( + color: Colors.grey, + fontSize: 12.sp, + ), + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 2.w), + child: Text( + '-', + style: TextStyle( + color: Colors.grey, + fontSize: 12.sp, + ), + ), + ), + Text( + DateUtil.formatDateMs( + data['endtime'], + format: 'HH:mm:ss', + isUtc: true, + ), + style: TextStyle( + color: Colors.grey, + fontSize: 12.sp, + ), + ), + 5.horizontalSpace, + Text( + '${(data['endtime'] - data['starttime']) / 1000}s', + style: TextStyle( + color: Colors.black54, + fontSize: 12.sp, + ), + ), + ], ), Padding( padding: - EdgeInsets.symmetric(horizontal: 2.w), + EdgeInsets.symmetric(vertical: 8.w), child: Text( - '-', + data['content'], + overflow: TextOverflow.ellipsis, + maxLines: 2, style: TextStyle( - color: Colors.grey, + color: isActive + ? Colors.red + : Colors.grey[700], fontSize: 12.sp, ), ), ), - Text( - DateUtil.formatDateMs( - data['endtime'], - format: 'HH:mm:ss', - isUtc: true, - ), - style: TextStyle( - color: Colors.grey, - fontSize: 12.sp, - ), - ), - 5.horizontalSpace, - Text( - '${(data['endtime'] - data['starttime']) / 1000}s', - style: TextStyle( - color: Colors.black54, - fontSize: 12.sp, - ), - ), ], ), - Padding( - padding: EdgeInsets.symmetric(vertical: 8.w), - child: Text( - data['content'], - overflow: TextOverflow.ellipsis, - maxLines: 2, - style: TextStyle( - color: Colors.grey[700], - fontSize: 12.sp, - ), - ), - ), - ], - ), - ); + ), + ); + }); }, ), if (item['isOmit'])