Browse Source

Merge branch 'new_dev' of https://github.com/deepcloud2048/deep_voice into new_dev

weicu
lxm 1 year ago
parent
commit
1894fc49d0
  1. 4
      lib/modules/meeting/controllers/meeting_home_controller.dart
  2. 15
      lib/modules/meeting/controllers/meeting_mine_controller.dart
  3. 84
      lib/modules/meeting/views/bottomSheet/statistics_bottom_sheet.dart
  4. 2
      pubspec.yaml

4
lib/modules/meeting/controllers/meeting_home_controller.dart

@ -36,7 +36,7 @@ class MeetingHomeController extends GetxController {
TextEditingController titleController = TextEditingController(); // 录音标题 TextEditingController titleController = TextEditingController(); // 录音标题
String titleCSuffix = ""; // 录音标题后缀 String titleCSuffix = ""; // 录音标题后缀
List originalDataList = []; RxList originalDataList = [].obs;
RxList dataList = [].obs; RxList dataList = [].obs;
RxString filtrateType = ''.obs; RxString filtrateType = ''.obs;
bool isAsc = false; bool isAsc = false;
@ -82,7 +82,7 @@ class MeetingHomeController extends GetxController {
// 请求本地数据 // 请求本地数据
void _getDataList() async { void _getDataList() async {
List list = await SqfliteApi.getMeetingList(); List list = await SqfliteApi.getMeetingList();
originalDataList = List.from(list); originalDataList.value = List.from(list);
dataList.value = List.from(list); dataList.value = List.from(list);
} }

15
lib/modules/meeting/controllers/meeting_mine_controller.dart

@ -4,12 +4,17 @@ import 'package:get/get.dart';
import '../../../data/services/db/sqflite_api.dart'; import '../../../data/services/db/sqflite_api.dart';
import '../../profile/controllers/profile_controller.dart'; import '../../profile/controllers/profile_controller.dart';
import 'meeting_controller.dart';
import 'meeting_home_controller.dart';
class MeetingMineController extends GetxController { class MeetingMineController extends GetxController {
final _meetingController = Get.find<MeetingController>();
final _homeController = Get.find<MeetingHomeController>();
final profileCtrl = Get.find<ProfileController>(); final profileCtrl = Get.find<ProfileController>();
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
bool isStatistics = true;
Map statistics = {}; Map statistics = {};
RxInt days = 0.obs; RxInt days = 0.obs;
@ -33,6 +38,14 @@ class MeetingMineController extends GetxController {
} }
}); });
_getStatistics(); _getStatistics();
ever(_meetingController.pageIndex, (value) {
if (isStatistics && value == 2) {
_getStatistics();
}
});
ever(_homeController.originalDataList, (value) {
isStatistics = true;
});
} }
@override @override
@ -42,6 +55,7 @@ class MeetingMineController extends GetxController {
} }
void _getStatistics() async { void _getStatistics() async {
if (!isStatistics) return;
List dataList = await SqfliteApi.getMeetingList(); List dataList = await SqfliteApi.getMeetingList();
numberFiles.value = dataList.length; numberFiles.value = dataList.length;
statistics = {}; statistics = {};
@ -97,5 +111,6 @@ class MeetingMineController extends GetxController {
maxNumberFiles.value = maxN; maxNumberFiles.value = maxN;
maxHourage.value = double.parse((maxH / 60 / 60).toStringAsFixed(2)); maxHourage.value = double.parse((maxH / 60 / 60).toStringAsFixed(2));
averageNumberFiles = (maxN + minN) ~/ 2; averageNumberFiles = (maxN + minN) ~/ 2;
isStatistics = false;
} }
} }

84
lib/modules/meeting/views/bottomSheet/statistics_bottom_sheet.dart

@ -1,8 +1,15 @@
import 'dart:io'; import 'dart:io';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:image_gallery_saver_plus/image_gallery_saver_plus.dart';
import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart';
import '../../../profile/controllers/profile_controller.dart'; import '../../../profile/controllers/profile_controller.dart';
import '../../controllers/meeting_mine_controller.dart'; import '../../controllers/meeting_mine_controller.dart';
@ -18,6 +25,8 @@ class _StatisticsBottomSheetState extends State<StatisticsBottomSheet> {
final _mineController = Get.find<MeetingMineController>(); final _mineController = Get.find<MeetingMineController>();
final _profileCtrl = Get.find<ProfileController>(); final _profileCtrl = Get.find<ProfileController>();
final GlobalKey _posterKey = GlobalKey();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
@ -30,12 +39,16 @@ class _StatisticsBottomSheetState extends State<StatisticsBottomSheet> {
height: 1.sh, height: 1.sh,
), ),
), ),
Column( Padding(
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Container( RepaintBoundary(
padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 20.w), key: _posterKey,
margin: EdgeInsets.symmetric(horizontal: 10.w), child: Container(
padding:
EdgeInsets.symmetric(horizontal: 15.w, vertical: 20.w),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(16.w), borderRadius: BorderRadius.circular(16.w),
@ -56,10 +69,12 @@ class _StatisticsBottomSheetState extends State<StatisticsBottomSheet> {
), ),
child: CircleAvatar( child: CircleAvatar(
radius: 25.w, radius: 25.w,
backgroundImage: _profileCtrl.localAvatar.value.isNotEmpty backgroundImage: _profileCtrl
.localAvatar.value.isNotEmpty
? FileImage(File(_profileCtrl.localAvatar.value)) ? FileImage(File(_profileCtrl.localAvatar.value))
: (_profileCtrl.userInfo.value.avatar.isNotEmpty : (_profileCtrl.userInfo.value.avatar.isNotEmpty
? NetworkImage(_profileCtrl.userInfo.value.avatar) ? NetworkImage(
_profileCtrl.userInfo.value.avatar)
: null) as ImageProvider<Object>?, : null) as ImageProvider<Object>?,
backgroundColor: Colors.grey[200], backgroundColor: Colors.grey[200],
child: (_profileCtrl.localAvatar.value.isEmpty && child: (_profileCtrl.localAvatar.value.isEmpty &&
@ -180,7 +195,8 @@ class _StatisticsBottomSheetState extends State<StatisticsBottomSheet> {
child: GridView.builder( child: GridView.builder(
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 52, crossAxisCount: 52,
mainAxisSpacing: 1.w, mainAxisSpacing: 1.w,
crossAxisSpacing: 1.w, crossAxisSpacing: 1.w,
@ -194,7 +210,8 @@ class _StatisticsBottomSheetState extends State<StatisticsBottomSheet> {
int type = 0; int type = 0;
if (_mineController.statistics if (_mineController.statistics
.containsKey(vIndex + 1)) { .containsKey(vIndex + 1)) {
if (_mineController.statistics[vIndex + 1]['count'] <= if (_mineController.statistics[vIndex + 1]
['count'] <=
_mineController.averageNumberFiles) { _mineController.averageNumberFiles) {
type = 1; type = 1;
} else { } else {
@ -237,19 +254,49 @@ class _StatisticsBottomSheetState extends State<StatisticsBottomSheet> {
], ],
), ),
), ),
),
SizedBox(height: 10.w), SizedBox(height: 10.w),
Padding( Row(
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: Row(
children: [ children: [
_button(Icons.share, '分享图片', Colors.deepOrange, () {}), _button(Icons.share, '分享图片', Colors.deepOrange, () async {
EasyLoading.show();
Uint8List pngBytes = await _generate();
final tempDir = await getTemporaryDirectory();
final String fileName =
'share_${DateTime.now().millisecondsSinceEpoch}.png';
final file = File('${tempDir.path}/$fileName');
await file.writeAsBytes(pngBytes);
final result = await SharePlus.instance.share(ShareParams(
text: '分享 DEAPSOUND',
files: [XFile(file.path)],
));
if (result.status == ShareResultStatus.success) {
Get.back();
EasyLoading.showToast('分享完成!');
}
EasyLoading.dismiss();
}),
10.horizontalSpace, 10.horizontalSpace,
_button(Icons.download, '保存图片', Colors.cyan, () {}), _button(Icons.download, '保存图片', Colors.cyan, () async {
EasyLoading.show();
Uint8List pngBytes = await _generate();
final result = await ImageGallerySaverPlus.saveImage(
pngBytes,
quality: 100,
);
if (result['isSuccess']) {
Get.back();
EasyLoading.showToast('保存成功');
} else {
EasyLoading.showToast('保存失败');
}
EasyLoading.dismiss();
}),
], ],
), ),
),
], ],
), ),
),
], ],
); );
} }
@ -324,4 +371,13 @@ class _StatisticsBottomSheetState extends State<StatisticsBottomSheet> {
), ),
); );
} }
Future<Uint8List> _generate() async {
RenderRepaintBoundary boundary =
_posterKey.currentContext!.findRenderObject()! as RenderRepaintBoundary;
ui.Image image = await boundary.toImage(pixelRatio: 6.0);
ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);
Uint8List pngBytes = byteData!.buffer.asUint8List();
return pngBytes;
}
} }

2
pubspec.yaml

@ -69,7 +69,7 @@ dependencies:
flutter_facebook_auth: ^7.1.1 flutter_facebook_auth: ^7.1.1
flutter_image_compress: ^2.4.0 flutter_image_compress: ^2.4.0
common_utils: ^2.1.0 common_utils: ^2.1.0
# image_cropper: ^9.0.0 image_gallery_saver_plus: ^4.0.1
dio: ^5.8.0+1 dio: ^5.8.0+1
sqflite: ^2.4.2 sqflite: ^2.4.2
path: ^1.9.1 path: ^1.9.1

Loading…
Cancel
Save