Browse Source

feat(用户积分): 在翻译和会议页面添加积分剩余时间显示

为翻译中间层视图和会议主页面的AppBar底部添加积分剩余时间显示组件,包含时间格式化和进度条展示功能。当用户登录时显示剩余积分时间,未登录时显示0。使用Obx实现数据响应式更新,并根据当前主题模式适配样式。
newdev_shunjiawei
lxm 10 months ago
parent
commit
603f1765a4
  1. 67
      lib/modules/meeting/views/meeting_home_view.dart
  2. 66
      lib/modules/translation/middleware/views/translation_middleware_view.dart

67
lib/modules/meeting/views/meeting_home_view.dart

@ -10,6 +10,7 @@ import '../controllers/meeting_home_controller.dart';
import '../model/meeting_model.dart'; import '../model/meeting_model.dart';
import '../utils/meeting_ui_utils.dart'; import '../utils/meeting_ui_utils.dart';
import 'bottomSheet/edit_title_bottom_sheet.dart'; import 'bottomSheet/edit_title_bottom_sheet.dart';
import '../../../../data/models/user_Info.dart';
///会议主页面,提供会议列表、会议详情、会议设置 ///会议主页面,提供会议列表、会议详情、会议设置
class MeetingHomeView extends StatefulWidget { class MeetingHomeView extends StatefulWidget {
@ -173,6 +174,60 @@ class _MeetingHomeViewState extends State<MeetingHomeView>
), ),
), ),
centerTitle: true, 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<MeetingHomeView>
: const SizedBox(); : const SizedBox();
}), }),
Obx(() { Obx(() {
Map taskData = _controller.taskAggregator.taskFinishList Map taskData =
.firstWhere( _controller.taskAggregator.taskFinishList.firstWhere(
(element) => element['id'] == data.id, (element) => element['id'] == data.id,
orElse: () => {}, orElse: () => {},
); );
@ -456,4 +511,12 @@ class _MeetingHomeViewState extends State<MeetingHomeView>
return '${hours}h ${remainingMinutes}m ${remainingSeconds}s'; 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)}';
}
} }

66
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 'package:flutter_screenutil/flutter_screenutil.dart';
import '../controllers/translation_middleware_controller.dart'; import '../controllers/translation_middleware_controller.dart';
import '../../../../core/theme/app_colors.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, 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)}';
}
} }

Loading…
Cancel
Save