5 changed files with 241 additions and 12 deletions
@ -0,0 +1,55 @@ |
|||||
|
import 'package:flutter/material.dart'; |
||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
||||
|
import 'package:get/get.dart'; |
||||
|
|
||||
|
import '../../utils/meeting_ui_utils.dart'; |
||||
|
|
||||
|
class MeetingCloudView extends StatefulWidget { |
||||
|
const MeetingCloudView({super.key}); |
||||
|
|
||||
|
@override |
||||
|
State<MeetingCloudView> createState() => _MeetingCloudViewState(); |
||||
|
} |
||||
|
|
||||
|
class _MeetingCloudViewState extends State<MeetingCloudView> { |
||||
|
@override |
||||
|
Widget build(BuildContext context) { |
||||
|
final isDarkMode = Theme.of(context).brightness == Brightness.dark; |
||||
|
|
||||
|
return Scaffold( |
||||
|
backgroundColor: MeetingUIUtils.getBackgroundColor(isDarkMode), |
||||
|
appBar: _buildAppBar(isDarkMode), |
||||
|
body: _buildBody(isDarkMode), |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
// 构建应用栏 |
||||
|
PreferredSizeWidget _buildAppBar(bool isDarkMode) { |
||||
|
return AppBar( |
||||
|
backgroundColor: isDarkMode ? Colors.black : Colors.white, |
||||
|
surfaceTintColor: Colors.transparent, |
||||
|
elevation: 0.5, |
||||
|
leading: IconButton( |
||||
|
icon: Icon( |
||||
|
Icons.arrow_back_ios, |
||||
|
color: isDarkMode ? Colors.white : Colors.black, |
||||
|
size: 20.sp, |
||||
|
), |
||||
|
onPressed: () => Get.back(), |
||||
|
), |
||||
|
title: Text( |
||||
|
'同步到云端', |
||||
|
style: TextStyle( |
||||
|
fontSize: 17.sp, |
||||
|
fontWeight: FontWeight.w600, |
||||
|
color: isDarkMode ? Colors.white : Colors.black, |
||||
|
), |
||||
|
), |
||||
|
centerTitle: true, |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
Widget _buildBody(bool isDarkMode) { |
||||
|
return Container(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,167 @@ |
|||||
|
import 'package:common_utils/common_utils.dart'; |
||||
|
import 'package:flutter/material.dart'; |
||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
||||
|
import 'package:get/get.dart'; |
||||
|
|
||||
|
import '../../../../routes/app_routes.dart'; |
||||
|
import '../../controllers/meeting_home_controller.dart'; |
||||
|
import '../../model/meeting_model.dart'; |
||||
|
import '../../utils/meeting_ui_utils.dart'; |
||||
|
|
||||
|
class MeetingTranscriptionView extends GetView<MeetingHomeController> { |
||||
|
const MeetingTranscriptionView({super.key}); |
||||
|
|
||||
|
@override |
||||
|
Widget build(BuildContext context) { |
||||
|
final isDarkMode = Theme.of(context).brightness == Brightness.dark; |
||||
|
|
||||
|
return Scaffold( |
||||
|
backgroundColor: MeetingUIUtils.getBackgroundColor(isDarkMode), |
||||
|
appBar: _buildAppBar(isDarkMode), |
||||
|
body: _buildBody(isDarkMode), |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
// 构建应用栏 |
||||
|
PreferredSizeWidget _buildAppBar(bool isDarkMode) { |
||||
|
return AppBar( |
||||
|
backgroundColor: isDarkMode ? Colors.black : Colors.white, |
||||
|
surfaceTintColor: Colors.transparent, |
||||
|
elevation: 0.5, |
||||
|
leading: IconButton( |
||||
|
icon: Icon( |
||||
|
Icons.arrow_back_ios, |
||||
|
color: isDarkMode ? Colors.white : Colors.black, |
||||
|
size: 20.sp, |
||||
|
), |
||||
|
onPressed: () => Get.back(), |
||||
|
), |
||||
|
title: Text( |
||||
|
'转写记录', |
||||
|
style: TextStyle( |
||||
|
fontSize: 17.sp, |
||||
|
fontWeight: FontWeight.w600, |
||||
|
color: isDarkMode ? Colors.white : Colors.black, |
||||
|
), |
||||
|
), |
||||
|
centerTitle: true, |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
Widget _buildBody(bool isDarkMode) { |
||||
|
return Obx( |
||||
|
() => ListView.builder( |
||||
|
itemCount: controller.originalDataList.length, |
||||
|
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 5.w), |
||||
|
itemBuilder: (BuildContext context, int index) { |
||||
|
MeetingModel data = |
||||
|
MeetingModel.fromJson(controller.originalDataList[index]); |
||||
|
return data.tasktype >= 2 |
||||
|
? _item(context, isDarkMode, data) |
||||
|
: const SizedBox.shrink(); |
||||
|
}, |
||||
|
), |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
Widget _item(BuildContext context, bool isDarkMode, MeetingModel data) { |
||||
|
return GestureDetector( |
||||
|
onTap: () { |
||||
|
Get.toNamed(Routes.meetingDetails, arguments: { |
||||
|
'id': data.id, |
||||
|
}); |
||||
|
}, |
||||
|
child: Container( |
||||
|
padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 10.w), |
||||
|
margin: EdgeInsets.symmetric(vertical: 5.w), |
||||
|
decoration: BoxDecoration( |
||||
|
color: isDarkMode |
||||
|
? MeetingUIUtils.getTranslucentWhite(0.05) |
||||
|
: MeetingUIUtils.getCardColor(isDarkMode), |
||||
|
borderRadius: BorderRadius.circular(12.w), |
||||
|
boxShadow: MeetingUIUtils.getCardShadow(isDarkMode), |
||||
|
), |
||||
|
child: Column( |
||||
|
crossAxisAlignment: CrossAxisAlignment.start, |
||||
|
children: [ |
||||
|
Text( |
||||
|
data.title, |
||||
|
style: TextStyle( |
||||
|
color: MeetingUIUtils.getTextColor(isDarkMode), |
||||
|
fontSize: 18.sp, |
||||
|
), |
||||
|
overflow: TextOverflow.ellipsis, |
||||
|
), |
||||
|
Padding( |
||||
|
padding: EdgeInsets.symmetric(vertical: 5.w), |
||||
|
child: Row( |
||||
|
children: [ |
||||
|
Icon( |
||||
|
Icons.calendar_month, |
||||
|
size: 14.w, |
||||
|
color: isDarkMode ? Colors.grey[400] : Colors.grey[500], |
||||
|
), |
||||
|
2.horizontalSpace, |
||||
|
Text( |
||||
|
DateUtil.formatDateMs( |
||||
|
data.creationtime, |
||||
|
format: DateFormats.y_mo_d_h_m, |
||||
|
), |
||||
|
style: TextStyle( |
||||
|
color: isDarkMode ? Colors.grey[400] : Colors.grey[500], |
||||
|
fontSize: 12.sp, |
||||
|
), |
||||
|
), |
||||
|
20.horizontalSpace, |
||||
|
Icon( |
||||
|
Icons.access_time, |
||||
|
size: 14.w, |
||||
|
color: isDarkMode ? Colors.grey[400] : Colors.grey[500], |
||||
|
), |
||||
|
2.horizontalSpace, |
||||
|
Text( |
||||
|
_formatDateSeconds(data.seconds), |
||||
|
style: TextStyle( |
||||
|
color: isDarkMode ? Colors.grey[400] : Colors.grey[500], |
||||
|
fontSize: 12.sp, |
||||
|
), |
||||
|
), |
||||
|
], |
||||
|
), |
||||
|
), |
||||
|
Container( |
||||
|
padding: EdgeInsets.symmetric(horizontal: 5.w, vertical: 2.w), |
||||
|
margin: EdgeInsets.only(top: 5.w), |
||||
|
decoration: BoxDecoration( |
||||
|
color: isDarkMode ? Colors.grey[900] : Colors.grey[100], |
||||
|
borderRadius: BorderRadius.circular(4.w), |
||||
|
), |
||||
|
child: Text( |
||||
|
data.type, |
||||
|
style: TextStyle( |
||||
|
color: isDarkMode ? Colors.grey[400] : Colors.grey[600], |
||||
|
fontSize: 10.sp, |
||||
|
), |
||||
|
), |
||||
|
), |
||||
|
], |
||||
|
), |
||||
|
), |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
String _formatDateSeconds(int seconds) { |
||||
|
if (seconds < 60) { |
||||
|
return '${seconds}s'; |
||||
|
} else if (seconds < 3600) { |
||||
|
int minutes = seconds ~/ 60; |
||||
|
int remainingSeconds = seconds % 60; |
||||
|
return '${minutes}m ${remainingSeconds}s'; |
||||
|
} else { |
||||
|
int hours = seconds ~/ 3600; |
||||
|
int remainingMinutes = (seconds % 3600) ~/ 60; |
||||
|
int remainingSeconds = seconds % 60; |
||||
|
return '${hours}h ${remainingMinutes}m ${remainingSeconds}s'; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue