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:image_gallery_saver_plus/image_gallery_saver_plus.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(); final double _width = 1.sw - 25.w; bool isWebViewReady = false; int imageType = 1; late final Worker _summaryNumberListener; @override void onInit() { super.onInit(); String html = ''' MindMap
'''; webViewController = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) ..setNavigationDelegate( NavigationDelegate( onPageFinished: (String url) { isWebViewReady = true; // 页面加载完成后立即应用当前主题 _applyCurrentTheme(); }, ), ) ..addJavaScriptChannel( 'ImageChannel', onMessageReceived: _messageReceived, ) ..setBackgroundColor(Colors.transparent) ..loadHtmlString(html); _summaryNumberListener = ever(_meetingDetailsController.summaryNumberModifications, (value) { webViewController.runJavaScript( 'updateMarkmap(`${_meetingDetailsController.meetingDetails.value.summary}`)'); }); } /// 应用当前主题到 WebView void _applyCurrentTheme() { if (!isWebViewReady) return; final isDark = Get.isDarkMode; webViewController.runJavaScript('updateTheme($isDark)'); } /// 供外部调用的主题更新方法 void updateTheme() { _applyCurrentTheme(); } @override void onClose() { _summaryNumberListener.dispose(); super.onClose(); } void _messageReceived(message) async { final String dataUrl = message.message; final String base64Str = dataUrl.split(',').last; final Uint8List bytes = base64.decode(base64Str); if (imageType == 1) { // 保存图片 final result = await ImageGallerySaverPlus.saveImage( bytes, quality: 100, ); if (result['isSuccess']) { EasyLoading.showToast('保存成功'); } } else { // 分享图片 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: 'shareMindMap'.tr, //对应中文:分享思维导图 files: [XFile(file.path)], )); if (result.status == ShareResultStatus.success) { EasyLoading.showToast('shareSuccess'.tr); //对应中文:分享成功 } } } }