Browse Source

优化思维导图显示

newdev_shunjiawei
tanlongsheng 1 year ago
parent
commit
3a8da2ac85
  1. 116
      lib/modules/meeting/views/mind_map_tab.dart

116
lib/modules/meeting/views/mind_map_tab.dart

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
@ -27,14 +28,11 @@ class _MindMapTabState extends State<MindMapTab>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MindMap</title> <title>MindMap</title>
<script> <script src="https://cdn.jsdelivr.net/npm/markmap-lib"></script>
window.markmap = { <script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
autoLoader: { <script src="https://cdn.jsdelivr.net/npm/markmap-view"></script>
toolbar: true, <script src="https://cdn.jsdelivr.net/npm/markmap-toolbar"></script>
}, <script src="https://cdn.jsdelivr.net/npm/save-svg-as-png@1.4.17/lib/saveSvgAsPng.min.js"></script>
};
</script>
<script src="https://cdn.jsdelivr.net/npm/markmap-autoloader@latest"></script>
<style> <style>
html, html,
body { body {
@ -45,51 +43,97 @@ class _MindMapTabState extends State<MindMapTab>
overflow: hidden; overflow: hidden;
} }
.markmap { .mind-map {
width: 100%; width: 100%;
height: 100%; height: 100%;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
} }
.markmap>svg { .mind-map #markmap {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.markmap>.mm-toolbar { .mind-map .mm-toolbar {
top: 20px !important; height: 30px;
bottom: initial !important; background: #fff;
border: 1px solid #d0d5dd;
border-radius: 8px;
display: flex;
justify-content: space-around;
align-items: center;
position: absolute;
top: 20px;
right: 20px;
} }
.markmap>.mm-toolbar>.mm-toolbar-brand { .mind-map .mm-toolbar-item {
display: none; width: 24px;
height: 24px;
border-radius: 6px;
cursor: pointer;
color: #101828;
display: flex;
justify-content: center;
align-items: center;
} }
.markmap>.mm-toolbar>.mm-toolbar-item:nth-child(2) { .mind-map .mm-toolbar-item.active {
margin-left: 0; background-color: #d4d4d8;
} }
</style> </style>
</head> </head>
<body> <body>
<div class="markmap"> <div class="mind-map">
<script type="text/template"> <svg id="markmap"></svg>
--- <div id="toolbar"></div>
markmap: </div>
maxWidth: 300 <script>
colorFreezeLevel: 2 const { Transformer, Markmap, Toolbar } = window.markmap;
initialExpandLevel: 3 const transformer = new Transformer();
--- const { root } = transformer.transform(`${_meetingDetailsController.meetingDetails.value.summary}`);
${_meetingDetailsController.meetingDetails.value.summary} let mm = Markmap.create('#markmap', {
</script> maxWidth: 300,
</div> initialExpandLevel: 3,
}, root);
const toolbar = Toolbar.create(mm);
toolbar.showBrand = false
toolbar.render();
const el = toolbar.el;
const toolbarElement = document.getElementById('toolbar');
toolbarElement.append(el);
async function captureImage() {
const markmapElement = document.getElementById('markmap');
markmapElement.style.height = `${1.sw}px`;
await mm.fit();
const options = {
scale: 2,
backgroundColor: '#FFFFFF',
encoderOptions: 1,
};
const uri = await svgAsPngUri(markmapElement, options);
markmapElement.style.height = '100%';
await mm.fit();
if (window.ImageChannel) {
window.ImageChannel.postMessage(uri);
}
}
</script>
</body> </body>
</html> </html>
'''; ''';
_controller = WebViewController() _controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted) ..setJavaScriptMode(JavaScriptMode.unrestricted)
..addJavaScriptChannel(
'ImageChannel',
onMessageReceived: (message) {
print('-------${message.message}------');
},
)
..setBackgroundColor(Colors.transparent) ..setBackgroundColor(Colors.transparent)
..loadHtmlString(html); ..loadHtmlString(html);
} }
@ -100,8 +144,20 @@ ${_meetingDetailsController.meetingDetails.value.summary}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); super.build(context);
return WebViewWidget( return Column(
controller: _controller, children: [
InkWell(
child: Text('保存111111'),
onTap: () async {
await _controller.runJavaScript('captureImage()');
},
),
Expanded(
child: WebViewWidget(
controller: _controller,
),
),
],
); );
} }
} }

Loading…
Cancel
Save