From 603f1765a415297e8ee9ca205c73bd55aeac790c Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Sat, 6 Dec 2025 16:57:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=94=A8=E6=88=B7=E7=A7=AF=E5=88=86):=20?= =?UTF-8?q?=E5=9C=A8=E7=BF=BB=E8=AF=91=E5=92=8C=E4=BC=9A=E8=AE=AE=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=B7=BB=E5=8A=A0=E7=A7=AF=E5=88=86=E5=89=A9=E4=BD=99?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为翻译中间层视图和会议主页面的AppBar底部添加积分剩余时间显示组件,包含时间格式化和进度条展示功能。当用户登录时显示剩余积分时间,未登录时显示0。使用Obx实现数据响应式更新,并根据当前主题模式适配样式。 --- .../meeting/views/meeting_home_view.dart | 67 ++++++++++++++++++- .../views/translation_middleware_view.dart | 66 ++++++++++++++++++ 2 files changed, 131 insertions(+), 2 deletions(-) diff --git a/lib/modules/meeting/views/meeting_home_view.dart b/lib/modules/meeting/views/meeting_home_view.dart index f9a9dd988..bf9cf58e4 100644 --- a/lib/modules/meeting/views/meeting_home_view.dart +++ b/lib/modules/meeting/views/meeting_home_view.dart @@ -10,6 +10,7 @@ import '../controllers/meeting_home_controller.dart'; import '../model/meeting_model.dart'; import '../utils/meeting_ui_utils.dart'; import 'bottomSheet/edit_title_bottom_sheet.dart'; +import '../../../../data/models/user_Info.dart'; ///会议主页面,提供会议列表、会议详情、会议设置 class MeetingHomeView extends StatefulWidget { @@ -173,6 +174,60 @@ class _MeetingHomeViewState extends State ), ), centerTitle: true, + bottom: PreferredSize( + preferredSize: Size.fromHeight(28.w), + child: Obx(() { + final _ = User.refreshTick.value; + final remain = User.isLoggedIn() ? User.instance.meetintegral : 0; + final total = User.isLoggedIn() ? User.instance.meettotalintegral : 0; + final double fraction = + total > 0 ? (remain / total).clamp(0.0, 1.0).toDouble() : 0.0; + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + padding: EdgeInsets.only(right: 12.w, bottom: 4.w), + alignment: Alignment.centerRight, + child: Text( + _formatHms(remain), + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.black54, + ), + ), + ), + LayoutBuilder( + builder: (context, constraints) { + final barWidth = constraints.maxWidth * fraction; + return Stack( + children: [ + Container( + height: 2.w, + decoration: BoxDecoration( + color: isDarkMode ? Colors.white10 : Colors.black12, + borderRadius: BorderRadius.circular(2.w), + ), + ), + Align( + alignment: Alignment.centerRight, + child: Container( + width: barWidth, + height: 2.w, + decoration: BoxDecoration( + color: MeetingUIUtils.getButtonColor(isDarkMode), + borderRadius: BorderRadius.circular(2.w), + ), + ), + ), + ], + ); + }, + ), + ], + ); + }), + ), ); } @@ -320,8 +375,8 @@ class _MeetingHomeViewState extends State : const SizedBox(); }), Obx(() { - Map taskData = _controller.taskAggregator.taskFinishList - .firstWhere( + Map taskData = + _controller.taskAggregator.taskFinishList.firstWhere( (element) => element['id'] == data.id, orElse: () => {}, ); @@ -456,4 +511,12 @@ class _MeetingHomeViewState extends State return '${hours}h ${remainingMinutes}m ${remainingSeconds}s'; } } + + String _formatHms(int seconds) { + int h = seconds ~/ 3600; + int m = (seconds % 3600) ~/ 60; + int s = seconds % 60; + String twoDigits(int n) => n.toString().padLeft(2, '0'); + return '${twoDigits(h)}:${twoDigits(m)}:${twoDigits(s)}'; + } } diff --git a/lib/modules/translation/middleware/views/translation_middleware_view.dart b/lib/modules/translation/middleware/views/translation_middleware_view.dart index adc9d95cb..678efb2d5 100644 --- a/lib/modules/translation/middleware/views/translation_middleware_view.dart +++ b/lib/modules/translation/middleware/views/translation_middleware_view.dart @@ -3,6 +3,7 @@ import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../controllers/translation_middleware_controller.dart'; import '../../../../core/theme/app_colors.dart'; +import '../../../../data/models/user_Info.dart'; /// 翻译中间层视图 /// 展示四种翻译功能的入口选项 @@ -44,6 +45,63 @@ class TranslationMiddlewareView color: isDarkMode ? Colors.white : Colors.black, ), ), + bottom: PreferredSize( + preferredSize: Size.fromHeight(28.w), + child: Obx(() { + final _ = User.refreshTick.value; + final remain = User.isLoggedIn() ? User.instance.tradeintegral : 0; + final total = + User.isLoggedIn() ? User.instance.tradetotalintegral : 0; + final double fraction = + total > 0 ? (remain / total).clamp(0.0, 1.0).toDouble() : 0.0; + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + padding: EdgeInsets.only(right: 12.w, bottom: 4.w), + alignment: Alignment.centerRight, + child: Text( + _formatHms(remain), + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.white70 : Colors.black54, + ), + ), + ), + LayoutBuilder( + builder: (context, constraints) { + final barWidth = constraints.maxWidth * fraction; + return Stack( + children: [ + Container( + height: 2.w, + decoration: BoxDecoration( + color: isDarkMode ? Colors.white10 : Colors.black12, + borderRadius: BorderRadius.circular(2.w), + ), + ), + Align( + alignment: Alignment.centerRight, + child: Container( + width: barWidth, + height: 2.w, + decoration: BoxDecoration( + color: isDarkMode + ? const Color(0xFF0066CC) + : Colors.blue, + borderRadius: BorderRadius.circular(2.w), + ), + ), + ), + ], + ); + }, + ), + ], + ); + }), + ), ); } @@ -152,4 +210,12 @@ class TranslationMiddlewareView ), ); } + + String _formatHms(int seconds) { + int h = seconds ~/ 3600; + int m = (seconds % 3600) ~/ 60; + int s = seconds % 60; + String twoDigits(int n) => n.toString().padLeft(2, '0'); + return '${twoDigits(h)}:${twoDigits(m)}:${twoDigits(s)}'; + } }