From cde1eb3e9bbe2d4dc059c443298876c6d73bf0b3 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 2 Mar 2026 17:36:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(meeting):=20=E6=94=AF=E6=8C=81=E6=80=9D?= =?UTF-8?q?=E7=BB=B4=E5=AF=BC=E5=9B=BE=E6=9A=97=E8=89=B2=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 CSS 变量实现主题色动态切换,支持明暗两种模式 - 更新工具栏样式变量,保证样式在暗色模式下一致 - 移除默认暗色按钮,保留放大、缩小、适配窗口、递归展开功能 - 新增 window.updateTheme 方法供前端动态切换主题颜色 - 截图功能根据当前主题调整背景颜色,确保暗色截图正常 - 加载完成后自动应用当前主题,避免初始加载样式错乱 - MindMapController 新增 updateTheme 方法供外部调用切换主题 - MindMapTab 监听主题变化,及时通知控制器更新 WebView 显示 --- .../controllers/mind_map_controller.dart | 73 +++++++++++++++++-- .../meeting/views/tabs/mind_map_tab.dart | 14 ++++ 2 files changed, 81 insertions(+), 6 deletions(-) diff --git a/lib/modules/meeting/controllers/mind_map_controller.dart b/lib/modules/meeting/controllers/mind_map_controller.dart index 09b91b613..4a155382a 100644 --- a/lib/modules/meeting/controllers/mind_map_controller.dart +++ b/lib/modules/meeting/controllers/mind_map_controller.dart @@ -41,6 +41,15 @@ class MindMapController extends GetxController { @@ -108,7 +126,9 @@ class MindMapController extends GetxController { initialExpandLevel: 3, }, root); const toolbar = Toolbar.create(mm); - toolbar.showBrand = false + toolbar.showBrand = false; + // 只保留放大、缩小、适配窗口、递归展开;移除自带的 dark 按钮 + toolbar.setItems(['zoomIn', 'zoomOut', 'fit', 'recurse']); toolbar.render(); const el = toolbar.el; const toolbarElement = document.getElementById('toolbar'); @@ -120,13 +140,40 @@ class MindMapController extends GetxController { await mm.fit(); } + // 动态切换主题颜色 + window.updateTheme = function(isDark) { + const r = document.documentElement; + if (isDark) { + // 确保 markmap 内部暗色样式与 App 暗色主题一致 + r.classList.add('markmap-dark'); + r.style.setProperty('--bg-color', '#121212'); + r.style.setProperty('--text-color', '#FFFFFF'); + r.style.setProperty('--toolbar-bg', '#2D2D2D'); + r.style.setProperty('--toolbar-border', '#404040'); + r.style.setProperty('--toolbar-text', '#FFFFFF'); + r.style.setProperty('--toolbar-active', '#404040'); + } else { + // 还原为浅色主题 + r.classList.remove('markmap-dark'); + r.style.setProperty('--bg-color', '#FFFFFF'); + r.style.setProperty('--text-color', '#000000'); + r.style.setProperty('--toolbar-bg', '#FFFFFF'); + r.style.setProperty('--toolbar-border', '#d0d5dd'); + r.style.setProperty('--toolbar-text', '#101828'); + r.style.setProperty('--toolbar-active', '#d4d4d8'); + } + // 保存当前主题用于截图 + window._isDarkTheme = isDark; + } + window.captureImage = async function() { const markmapElement = document.getElementById('markmap'); markmapElement.style.height = `${_width}px`; await mm.fit(); + const bgColor = window._isDarkTheme ? '#121212' : '#FFFFFF'; const options = { scale: 2, - backgroundColor: '#FFFFFF', + backgroundColor: bgColor, encoderOptions: 1, }; const uri = await svgAsPngUri(markmapElement, options); @@ -147,6 +194,8 @@ class MindMapController extends GetxController { NavigationDelegate( onPageFinished: (String url) { isWebViewReady = true; + // 页面加载完成后立即应用当前主题 + _applyCurrentTheme(); }, ), ) @@ -163,6 +212,18 @@ class MindMapController extends GetxController { }); } + /// 应用当前主题到 WebView + void _applyCurrentTheme() { + if (!isWebViewReady) return; + final isDark = Get.isDarkMode; + webViewController.runJavaScript('updateTheme($isDark)'); + } + + /// 供外部调用的主题更新方法 + void updateTheme() { + _applyCurrentTheme(); + } + @override void onClose() { _summaryNumberListener.dispose(); diff --git a/lib/modules/meeting/views/tabs/mind_map_tab.dart b/lib/modules/meeting/views/tabs/mind_map_tab.dart index c4e92fc08..8811dd7ea 100644 --- a/lib/modules/meeting/views/tabs/mind_map_tab.dart +++ b/lib/modules/meeting/views/tabs/mind_map_tab.dart @@ -15,9 +15,23 @@ class _MindMapTabState extends State with AutomaticKeepAliveClientMixin { final _controller = Get.find(); + // 缓存上一次的主题模式,用于检测变化 + Brightness? _lastBrightness; + @override bool get wantKeepAlive => true; + @override + void didChangeDependencies() { + super.didChangeDependencies(); + final currentBrightness = Theme.of(context).brightness; + // 仅在主题实际变化时通知控制器更新 WebView + if (_lastBrightness != null && _lastBrightness != currentBrightness) { + _controller.updateTheme(); + } + _lastBrightness = currentBrightness; + } + @override Widget build(BuildContext context) { super.build(context);