From 4b6bb2c76092ae81d9f7c08f25826c3dbec952be Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 24 Jun 2025 18:43:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=80=9D=E7=BB=B4=E5=AF=BC?= =?UTF-8?q?=E5=9B=BE=E5=88=86=E4=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bindings/meeting_details_binding.dart | 2 + .../controllers/mind_map_controller.dart | 155 ++++++++++++++++++ lib/modules/meeting/views/mind_map_tab.dart | 143 +--------------- .../meeting/views/share_bottom_sheet.dart | 12 +- 4 files changed, 170 insertions(+), 142 deletions(-) create mode 100644 lib/modules/meeting/controllers/mind_map_controller.dart diff --git a/lib/modules/meeting/bindings/meeting_details_binding.dart b/lib/modules/meeting/bindings/meeting_details_binding.dart index 6676625bd..2d96cd899 100644 --- a/lib/modules/meeting/bindings/meeting_details_binding.dart +++ b/lib/modules/meeting/bindings/meeting_details_binding.dart @@ -1,10 +1,12 @@ import 'package:get/get.dart'; import '../controllers/meeting_details_controller.dart'; +import '../controllers/mind_map_controller.dart'; class MeetingDetailsBinding extends Bindings { @override void dependencies() { // 注册控制器 Get.lazyPut(() => MeetingDetailsController()); + Get.lazyPut(() => MindMapController()); } } diff --git a/lib/modules/meeting/controllers/mind_map_controller.dart b/lib/modules/meeting/controllers/mind_map_controller.dart new file mode 100644 index 000000000..83a6656c9 --- /dev/null +++ b/lib/modules/meeting/controllers/mind_map_controller.dart @@ -0,0 +1,155 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +import 'meeting_details_controller.dart'; + +class MindMapController extends GetxController { + late final WebViewController webViewController; + final _meetingDetailsController = Get.find(); + + @override + void onInit() { + super.onInit(); + String html = ''' + + + + + + + MindMap + + + + + + + + + +
+ +
+
+ + + + + '''; + webViewController = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..addJavaScriptChannel( + 'ImageChannel', + onMessageReceived: _messageReceived, + ) + ..setBackgroundColor(Colors.transparent) + ..loadHtmlString(html); + } + + void _messageReceived(message) async { + final String dataUrl = message.message; + final String base64Str = dataUrl.split(',').last; + final Uint8List bytes = base64.decode(base64Str); + final String fileName = + '${_meetingDetailsController.meetingData.value.title} mindmap.png'; + final tempDir = await getTemporaryDirectory(); + final File file = File('${tempDir.path}/$fileName'); + await file.writeAsBytes(bytes); + final result = await SharePlus.instance.share(ShareParams( + text: '分享思维导图', + files: [XFile(file.path)], + )); + if (result.status == ShareResultStatus.success) { + EasyLoading.showToast('分享完成!'); + } + } +} diff --git a/lib/modules/meeting/views/mind_map_tab.dart b/lib/modules/meeting/views/mind_map_tab.dart index 6a7523b20..38e83691d 100644 --- a/lib/modules/meeting/views/mind_map_tab.dart +++ b/lib/modules/meeting/views/mind_map_tab.dart @@ -1,9 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:webview_flutter/webview_flutter.dart'; -import '../controllers/meeting_details_controller.dart'; +import '../controllers/mind_map_controller.dart'; class MindMapTab extends StatefulWidget { const MindMapTab({super.key}); @@ -14,129 +13,7 @@ class MindMapTab extends StatefulWidget { class _MindMapTabState extends State with AutomaticKeepAliveClientMixin { - late final WebViewController _controller; - final _meetingDetailsController = Get.find(); - - @override - void initState() { - super.initState(); - String html = ''' - - - - - - - MindMap - - - - - - - - - -
- -
-
- - - - - '''; - _controller = WebViewController() - ..setJavaScriptMode(JavaScriptMode.unrestricted) - ..addJavaScriptChannel( - 'ImageChannel', - onMessageReceived: (message) { - print('-------${message.message}------'); - }, - ) - ..setBackgroundColor(Colors.transparent) - ..loadHtmlString(html); - } + final _controller = Get.find(); @override bool get wantKeepAlive => true; @@ -144,20 +21,8 @@ class _MindMapTabState extends State @override Widget build(BuildContext context) { super.build(context); - return Column( - children: [ - InkWell( - child: Text('保存111111'), - onTap: () async { - await _controller.runJavaScript('captureImage()'); - }, - ), - Expanded( - child: WebViewWidget( - controller: _controller, - ), - ), - ], + return WebViewWidget( + controller: _controller.webViewController, ); } } diff --git a/lib/modules/meeting/views/share_bottom_sheet.dart b/lib/modules/meeting/views/share_bottom_sheet.dart index 318d40df7..938d2e6c7 100644 --- a/lib/modules/meeting/views/share_bottom_sheet.dart +++ b/lib/modules/meeting/views/share_bottom_sheet.dart @@ -11,6 +11,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; import '../controllers/meeting_details_controller.dart'; +import '../controllers/mind_map_controller.dart'; class ShareBottomSheet extends StatefulWidget { const ShareBottomSheet({super.key}); @@ -125,28 +126,33 @@ class _ShareBottomSheetState extends State { _share(_controller.meetingData.value.filepath, '分享会议音频'); }), _shareItem(Icons.message, '导出转写', onTap: () async { + Get.back(); final tempDir = await getTemporaryDirectory(); final file = File( '${tempDir.path}/${_controller.meetingData.value.title} speaker.txt'); String allText = _getAllText(); await file.writeAsString(allText); - Get.back(); _share(file.path, '分享会议转写'); }), _shareItem(Icons.article, '导出总结', onTap: () async { + Get.back(); final tempDir = await getTemporaryDirectory(); final file = File( '${tempDir.path}/${_controller.meetingData.value.title} summary.txt'); await file.writeAsString( _controller.meetingDetails.value.summary); - Get.back(); _share(file.path, '分享会议总结'); }), _shareItem( Icons.lan, '导出思维导图', isBorder: false, - onTap: () {}, + onTap: () { + Get.back(); + final mindMapController = Get.find(); + mindMapController.webViewController + .runJavaScript('captureImage()'); + }, ), ]), ],