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(); final String summaryJs = _jsString(_meetingDetailsController.meetingDetails.value.summary); 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(${_jsString(_meetingDetailsController.meetingDetails.value.summary)})'); }); } /// 把任意文本编码成一个合法的 JS 字符串字面量。 /// /// ⚠️ 总结正文是大模型产出的 Markdown,里头出现反引号(行内代码、甚至整段 /// ```markdown 包裹)是常事。原先直接拼进 JS 模板串 `${summary}`,一个反引号 /// 就让整个 ` 会提前截断脚本块。 static String _jsString(String value) => jsonEncode(value).replaceAll('