Browse Source

[new]增加思维导图本地调用

zk 1 year ago
parent
commit
0a77eb23be

File diff suppressed because it is too large
+ 2 - 0
assets/html/d3.js


File diff suppressed because it is too large
+ 1 - 0
assets/html/dsbridge.js


File diff suppressed because it is too large
+ 151 - 0
assets/html/index.html


File diff suppressed because it is too large
+ 10 - 0
assets/html/markmap-lib.js


File diff suppressed because it is too large
+ 12 - 0
assets/html/markmap-view.js


+ 40 - 3
lib/module/talk/controller.dart

@@ -1,6 +1,7 @@
 import 'dart:async';
 import 'dart:io';
 import 'package:connectivity_plus/connectivity_plus.dart';
+import 'package:dsbridge_flutter/dsbridge_flutter.dart';
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/account_repository.dart';
@@ -10,6 +11,7 @@ import 'package:electronic_assistant/module/chat/view.dart';
 import 'package:electronic_assistant/module/login/view.dart';
 import 'package:electronic_assistant/module/record/record_handler.dart';
 import 'package:electronic_assistant/module/store/view.dart';
+import 'package:electronic_assistant/module/talk/mindmap/mind_util.dart';
 import 'package:electronic_assistant/module/talk/todo/controller.dart';
 import 'package:electronic_assistant/resource/assets.gen.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
@@ -23,6 +25,7 @@ import 'package:electronic_assistant/utils/mmkv_util.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/scheduler.dart';
+import 'package:flutter/services.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:get/get.dart';
@@ -45,6 +48,7 @@ import '../../utils/common_utils.dart';
 import '../../utils/event_bus.dart';
 import '../../utils/system_share_util.dart';
 import '../../utils/toast_util.dart';
+import 'package:webview_flutter/webview_flutter.dart';
 
 class TalkController extends BaseController {
   static const String argumentItem = 'argument_item';
@@ -140,6 +144,9 @@ class TalkController extends BaseController {
 
   double? get headViewHeight => _headViewHeight.value;
 
+  final DWebViewController webViewController =
+      MindUtil.createMindWebViewController();
+
   @override
   void onInit() {
     super.onInit();
@@ -628,13 +635,43 @@ class TalkController extends BaseController {
         _shareSummaryOrOriginal(
             talkBean.value!.id, fileName, type, shareTo, tag);
       } else if (type == ShareTalkType.mindMap) {
-        //TODO 生成思维导图
-        _shareMindMap();
+        _shareMindMap(
+            talkBean.value?.title.value, talkBean.value?.summary.value);
       }
     });
   }
 
-  void _shareMindMap() {}
+  Future<String> loadSvgFromAssets() async {
+    String svgString = await rootBundle.loadString('assets/images/test2.svg');
+    return svgString;
+  }
+
+  void _shareMindMap(String? title, String? summary) async {
+    // String svgString = await loadSvgFromAssets();
+    // final pngBytes = await MindUtil.svgToPng(svgString, Get.context!);
+    // MindUtil.convertToFile(pngBytes, 'test.png');
+    // webViewController.callHandler(MindUtil.functionToJsExport, args: ['test'],
+    //     handler: (value) async {
+    //       if (value == null) {
+    //         throw Exception('Unable to convert SVG to PNG');
+    //       }
+    //       debugPrint('mindMap summary: $value');
+    //
+    //       ToastUtil.showToast('思维导图svg下载成功');
+    //     });
+
+    // await webViewController.loadFlutterAsset(Assets.html.index);
+    // webViewController.setNavigationDelegate(
+    //   NavigationDelegate(
+    //     onPageFinished: (String url) {
+    //
+    //     },
+    //     onNavigationRequest: (NavigationRequest request) {
+    //       return NavigationDecision.navigate;
+    //     },
+    //   ),
+    // );
+  }
 
   void _shareSummaryOrOriginal(String id, String fileName, ShareTalkType type,
       ShareTo shareTo, String tag) async {

+ 77 - 2
lib/module/talk/mindmap/controller.dart

@@ -1,7 +1,18 @@
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:typed_data';
+import 'dart:ui';
+import 'package:flutter/material.dart';
+import 'package:path_provider/path_provider.dart';
 import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/module/talk/mindmap/mind_util.dart';
+import 'package:electronic_assistant/resource/assets.gen.dart';
+import 'package:flutter/rendering.dart';
+import 'package:flutter/widgets.dart';
 import 'package:get/get.dart';
 import 'package:get/get_core/src/get_main.dart';
-
+import 'package:webview_flutter/webview_flutter.dart';
 import '../../../data/bean/template_bean.dart';
 import '../controller.dart';
 
@@ -18,9 +29,67 @@ class MindMapController extends BaseController {
 
   RxBool get isShowMindFullScreen => talkController.isShowMindFullScreen;
 
+  StreamSubscription? _talkSummaryListener;
+  GlobalKey repaintKey = GlobalKey();
+
   @override
-  void onReady() {
+  void onReady() async {
     super.onReady();
+    // await talkController.webViewController
+    //     .loadRequest(Uri.parse('http://192.168.10.144:9528/'));
+    // await talkController.webViewController.loadFlutterAsset(Assets.images.test);
+    // talkController.webViewController.setBackgroundColor(Colors.blue);
+    talkController.webViewController.loadFlutterAsset(Assets.html.index);
+    talkController.webViewController.setNavigationDelegate(
+      NavigationDelegate(
+        onPageFinished: (String url) async {
+          _dealTalkSummaryUpdate(talkController.talkBean.value?.summary.value);
+        },
+        onNavigationRequest: (NavigationRequest request) {
+          return NavigationDecision.navigate;
+        },
+      ),
+    );
+    _talkSummaryListener =
+        talkController.talkBean.value?.summary.listen((summary) {
+      _dealTalkSummaryUpdate(summary);
+    });
+  }
+
+  // // Capture WebView content as a PNG image
+  // Future<void> _captureAndSaveScreenshot() async {
+  //   try {
+  //     // Render the content inside RepaintBoundary to a picture
+  //     RenderRepaintBoundary boundary = repaintKey.currentContext!
+  //         .findRenderObject() as RenderRepaintBoundary;
+  //     var image = await boundary.toImage(
+  //         pixelRatio: 3); // Higher pixel ratio for better quality
+  //
+  //     // Convert the image to byte data
+  //     ByteData? byteData = await image.toByteData(format: ImageByteFormat.png);
+  //     Uint8List uint8List = byteData!.buffer.asUint8List();
+  //
+  //     // Get the path to save the image
+  //     final directory = await getApplicationDocumentsDirectory();
+  //     final path = '${directory.path}/webview_screenshot.png';
+  //
+  //     // Save the file
+  //     final file = File(path);
+  //     await file.writeAsBytes(uint8List);
+  //
+  //     print('Screenshot saved at $path');
+  //   } catch (e) {
+  //     print("Error taking screenshot: $e");
+  //   }
+  // }
+
+  void _dealTalkSummaryUpdate(String? summary) {
+    debugPrint('mindMap summary: $summary');
+    talkController.webViewController
+        .callHandler(MindUtil.functionToJsUpdateMind, args: [summary],
+            handler: (value) {
+      debugPrint('mindMap summary: $value');
+    });
   }
 
   void addTemplateClick() {}
@@ -32,4 +101,10 @@ class MindMapController extends BaseController {
   void exitFullScreenClick() {
     talkController.onExitMindFullScreen();
   }
+
+  @override
+  void onClose() {
+    super.onClose();
+    _talkSummaryListener?.cancel();
+  }
 }

+ 98 - 0
lib/module/talk/mindmap/mind_util.dart

@@ -0,0 +1,98 @@
+import 'dart:io';
+import 'dart:typed_data';
+import 'dart:ui';
+import 'package:dsbridge_flutter/dsbridge_flutter.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:path_provider/path_provider.dart';
+import 'package:webview_flutter/webview_flutter.dart';
+import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';
+import 'package:xml/xml.dart' as xml;
+
+class MindUtil {
+  MindUtil._();
+
+  static const String functionToJsUpdateMind = "updateValue";
+  static const String functionToJsExport = "export";
+
+  static DWebViewController createMindWebViewController() {
+    late final PlatformWebViewControllerCreationParams params;
+    if (WebViewPlatform.instance is WebKitWebViewPlatform) {
+      params = WebKitWebViewControllerCreationParams(
+        allowsInlineMediaPlayback: true,
+        mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},
+      );
+    } else {
+      params = const PlatformWebViewControllerCreationParams();
+    }
+    DWebViewController webViewController =
+        DWebViewController.fromPlatformCreationParams(params);
+    webViewController.setJavaScriptMode(JavaScriptMode.unrestricted);
+    webViewController.enableZoom(false);
+    return webViewController;
+  }
+
+  static Future<void> convertToFile(Uint8List bytes, String fileName) async {
+    final directory = await getTemporaryDirectory();
+    final file = File('${directory.path}/$fileName');
+    await file.writeAsBytes(bytes);
+  }
+
+  static Future<void> convertMapDataToToFile(
+      dynamic data, String fileName) async {
+    Uint8List? bytes = convertMapToUint8List(data);
+    if (bytes == null) {
+      return;
+    }
+    final directory = await getTemporaryDirectory();
+    final file = File('${directory.path}/$fileName');
+    await file.writeAsBytes(bytes);
+  }
+
+  static Uint8List? convertMapToUint8List(dynamic map) {
+    if (map is Map) {
+      final value = map.values.toList().cast<int>();
+      return Uint8List.fromList(value);
+    }
+    return null;
+  }
+
+  static Future<Uint8List> svgToPng(
+      String svgString, BuildContext context) async {
+    final pictureInfo =
+        await vg.loadPicture(SvgStringLoader(svgString), context);
+
+    final image = await pictureInfo.picture.toImage(100, 100);
+    final byteData = await image.toByteData(format: ImageByteFormat.png);
+
+    if (byteData == null) {
+      throw Exception('Unable to convert SVG to PNG');
+    }
+
+    final pngBytes = byteData.buffer.asUint8List();
+    return pngBytes;
+  }
+
+  static Future<Uint8List?> svgToPng2(String svgString) async {
+// first parse svgString to get width and height using xml plugin
+    final document = xml.XmlDocument.parse(svgString);
+    final svgElement = document.rootElement;
+    final widthAttribute =
+        svgElement.getAttribute('width')!.replaceAll("px", "");
+    final heightAttribute =
+        svgElement.getAttribute('height')!.replaceAll("px", "");
+
+    final svgDrawableRoot =
+        await vg.loadPicture(SvgStringLoader(svgString), null);
+    // same thing
+
+    // Convert to ui.Image. toImage() takes width and height as parameters
+    // you need to find the best size to suit your needs and take into account the screen DPI
+    final image = await svgDrawableRoot.picture.toImage(
+        int.parse(widthAttribute.toString()),
+        int.parse(heightAttribute.toString()));
+    ByteData? bytes = await image.toByteData(format: ImageByteFormat.png);
+
+    return bytes?.buffer.asUint8List();
+  }
+}

+ 0 - 62
lib/module/talk/mindmap/mindview/controller.dart

@@ -1,62 +0,0 @@
-import 'dart:io';
-import 'dart:typed_data';
-
-import 'package:dsbridge_flutter/dsbridge_flutter.dart';
-import 'package:electronic_assistant/base/base_controller.dart';
-import 'package:webview_flutter/webview_flutter.dart';
-import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';
-import 'package:path_provider/path_provider.dart';
-
-import 'js_api.dart';
-
-class MindViewController extends BaseController {
-  late final DWebViewController webViewController;
-
-  @override
-  void onInit() {
-    super.onInit();
-    late final PlatformWebViewControllerCreationParams params;
-    if (WebViewPlatform.instance is WebKitWebViewPlatform) {
-      params = WebKitWebViewControllerCreationParams(
-        allowsInlineMediaPlayback: true,
-        mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},
-      );
-    } else {
-      params = const PlatformWebViewControllerCreationParams();
-    }
-    webViewController = DWebViewController.fromPlatformCreationParams(params);
-    webViewController.setJavaScriptMode(JavaScriptMode.unrestricted);
-    webViewController.enableZoom(false);
-    webViewController.loadRequest(Uri.parse('http://192.168.10.144:9528'));
-
-    Future.delayed(const Duration(seconds: 3), () {
-      webViewController.callHandler(JsMindApi.functionToJsExport,
-          args: ['test'], handler: (value) {
-        saveToFile(value);
-      });
-    });
-  }
-
-  Future<void> saveToFile(dynamic data) async {
-    Uint8List? bytes = convertMapToUint8List(data);
-    if (bytes == null) {
-      return;
-    }
-    final directory = await getApplicationDocumentsDirectory();
-    final file = File('${directory.path}/output_file.png');
-    await file.writeAsBytes(bytes);
-  }
-
-  Uint8List? convertMapToUint8List(dynamic map) {
-    if (map is Map) {
-      final value = map.values.toList().cast<int>();
-      return Uint8List.fromList(value);
-    }
-    return null;
-  }
-
-  @override
-  void onReady() {
-    super.onReady();
-  }
-}

+ 0 - 9
lib/module/talk/mindmap/mindview/js_api.dart

@@ -1,9 +0,0 @@
-import 'package:dsbridge_flutter/dsbridge_flutter.dart';
-
-class JsMindApi extends JavaScriptNamespaceInterface {
-  static const String functionToJsUpdateMind = "updateValue";
-  static const String functionToJsExport = "export";
-
-  @override
-  void register() {}
-}

+ 0 - 21
lib/module/talk/mindmap/mindview/view.dart

@@ -1,21 +0,0 @@
-import 'package:dsbridge_flutter/dsbridge_flutter.dart';
-import 'package:electronic_assistant/base/base_page.dart';
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/src/widgets/framework.dart';
-import 'controller.dart';
-
-class MindView extends BasePage<MindViewController> {
-  const MindView(this.markdown, {super.key});
-
-  final String markdown;
-
-  @override
-  bool immersive() {
-    return true;
-  }
-
-  @override
-  Widget buildBody(BuildContext context) {
-    return DWebViewWidget(controller: controller.webViewController);
-  }
-}

+ 3 - 3
lib/module/talk/mindmap/view.dart

@@ -1,17 +1,17 @@
+import 'package:dsbridge_flutter/dsbridge_flutter.dart';
 import 'package:electronic_assistant/base/base_page.dart';
 import 'package:electronic_assistant/data/bean/talks.dart';
 import 'package:electronic_assistant/module/talk/mindmap/controller.dart';
 import 'package:electronic_assistant/resource/assets.gen.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
 import 'package:flutter/src/widgets/framework.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:get/get_core/src/get_main.dart';
-
 import '../../../resource/string.gen.dart';
 import '../common_view.dart';
-import 'mindview/view.dart';
 
 class MindMapView extends BasePage<MindMapController> {
   final String? talkId;
@@ -60,7 +60,7 @@ class MindMapView extends BasePage<MindMapController> {
   Widget _buildMindView() {
     return Stack(
       children: [
-        MindView(controller.talkController.talkBean.value!.summary.value!),
+        DWebViewWidget(controller: controller.talkController.webViewController),
         Obx(() {
           return Visibility(
             visible: !controller.isShowMindFullScreen.value,

+ 0 - 1
lib/router/app_pages.dart

@@ -34,7 +34,6 @@ import '../module/modelexplain/controller.dart';
 import '../module/record/view.dart';
 import '../module/splash/view.dart';
 import '../module/talk/controller.dart';
-import '../module/talk/mindmap/mindview/controller.dart';
 
 abstract class AppPage {
   static final pages = <GetPage>[

+ 34 - 34
pubspec.lock

@@ -249,10 +249,10 @@ packages:
     dependency: transitive
     description:
       name: cli_util
-      sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19
+      sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
       url: "https://pub.dev"
     source: hosted
-    version: "0.4.1"
+    version: "0.4.2"
   clock:
     dependency: transitive
     description:
@@ -265,10 +265,10 @@ packages:
     dependency: transitive
     description:
       name: code_builder
-      sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
+      sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
       url: "https://pub.dev"
     source: hosted
-    version: "4.10.0"
+    version: "4.10.1"
   collection:
     dependency: transitive
     description:
@@ -329,10 +329,10 @@ packages:
     dependency: transitive
     description:
       name: csslib
-      sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
+      sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.0"
+    version: "1.0.2"
   cupertino_icons:
     dependency: transitive
     description:
@@ -469,10 +469,10 @@ packages:
     dependency: "direct main"
     description:
       name: flutter_foreground_task
-      sha256: daf2e0a6dd863aeab84055c9671f4fb1449205771dcba01f4d635e3d0dfa8b3e
+      sha256: "07a1719309be8c1d6ee09d2b2bb9c1136b877f94ddc272d43a7edcf11788ab57"
       url: "https://pub.dev"
     source: hosted
-    version: "8.12.0"
+    version: "8.13.0"
   flutter_gen_core:
     dependency: transitive
     description:
@@ -581,10 +581,10 @@ packages:
     dependency: transitive
     description:
       name: flutter_svg
-      sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2"
+      sha256: de82e6bf958cec7190fbc1c5298282c851228e35ae2b14e2b103e7f777818c64
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.10+1"
+    version: "2.0.13"
   flutter_test:
     dependency: "direct dev"
     description: flutter
@@ -725,10 +725,10 @@ packages:
     dependency: transitive
     description:
       name: html
-      sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
+      sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec"
       url: "https://pub.dev"
     source: hosted
-    version: "0.15.4"
+    version: "0.15.5"
   http:
     dependency: transitive
     description:
@@ -837,10 +837,10 @@ packages:
     dependency: "direct main"
     description:
       name: just_audio
-      sha256: b41646a8241688f1d99c2e69c4da2bb26aa4b3a99795f6ff205c2a165e033fda
+      sha256: a49e7120b95600bd357f37a2bb04cd1e88252f7cdea8f3368803779b925b1049
       url: "https://pub.dev"
     source: hosted
-    version: "0.9.41"
+    version: "0.9.42"
   just_audio_platform_interface:
     dependency: transitive
     description:
@@ -973,10 +973,10 @@ packages:
     dependency: transitive
     description:
       name: mmkv_android
-      sha256: "721540c18d8858020fd1cb763efe81621026b2a434da0da50a4810ac19a5ab31"
+      sha256: fa5c955216d7ff0b61781116ebc72273c5e8520b5bde498a25408fadd41a8a00
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.7"
+    version: "1.0.8"
   mmkv_ios:
     dependency: transitive
     description:
@@ -1061,18 +1061,18 @@ packages:
     dependency: transitive
     description:
       name: path_parsing
-      sha256: "45f7d6bba1128761de5540f39d5ca000ea8a1f22f06b76b61094a60a2997bd0e"
+      sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.2"
+    version: "1.1.0"
   path_provider:
     dependency: transitive
     description:
       name: path_provider
-      sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378
+      sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.4"
+    version: "2.1.5"
   path_provider_android:
     dependency: transitive
     description:
@@ -1173,10 +1173,10 @@ packages:
     dependency: "direct main"
     description:
       name: photo_manager
-      sha256: "4e156239896c619c9f092ba6d200e4292b1d0084e3ca38c559818053ee483e84"
+      sha256: f5ef2618870e9a50d8bfeb81a02c242d580ae8614bd5ea9e1b80dbb7e49d4260
       url: "https://pub.dev"
     source: hosted
-    version: "3.5.2"
+    version: "3.6.1"
   platform:
     dependency: transitive
     description:
@@ -1560,10 +1560,10 @@ packages:
     dependency: transitive
     description:
       name: url_launcher_android
-      sha256: "0dea215895a4d254401730ca0ba8204b29109a34a99fb06ae559a2b60988d2de"
+      sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
       url: "https://pub.dev"
     source: hosted
-    version: "6.3.13"
+    version: "6.3.14"
   url_launcher_ios:
     dependency: transitive
     description:
@@ -1624,26 +1624,26 @@ packages:
     dependency: transitive
     description:
       name: vector_graphics
-      sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3"
+      sha256: "773c9522d66d523e1c7b25dfb95cc91c26a1e17b107039cfe147285e92de7878"
       url: "https://pub.dev"
     source: hosted
-    version: "1.1.11+1"
+    version: "1.1.14"
   vector_graphics_codec:
     dependency: transitive
     description:
       name: vector_graphics_codec
-      sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da
+      sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb"
       url: "https://pub.dev"
     source: hosted
-    version: "1.1.11+1"
+    version: "1.1.12"
   vector_graphics_compiler:
     dependency: transitive
     description:
       name: vector_graphics_compiler
-      sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81"
+      sha256: "26d520739b7c6b5d2a2b3274427874a8390831fd4cd5bb8cfbd7d913477d3a2e"
       url: "https://pub.dev"
     source: hosted
-    version: "1.1.11+1"
+    version: "1.1.14"
   vector_math:
     dependency: transitive
     description:
@@ -1776,10 +1776,10 @@ packages:
     dependency: transitive
     description:
       name: webview_flutter_wkwebview
-      sha256: d4034901d96357beb1b6717ebf7d583c88e40cfc6eb85fe76dd1bf0979a9f251
+      sha256: f14ee08021772fed913da8daebcfdeb46be457081e521e93e9918fe6cd1ce9e8
       url: "https://pub.dev"
     source: hosted
-    version: "3.16.0"
+    version: "3.16.1"
   wechat_kit:
     dependency: "direct main"
     description:
@@ -1792,10 +1792,10 @@ packages:
     dependency: transitive
     description:
       name: win32
-      sha256: "10169d3934549017f0ae278ccb07f828f9d6ea21573bab0fb77b0e1ef0fce454"
+      sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2"
       url: "https://pub.dev"
     source: hosted
-    version: "5.7.2"
+    version: "5.8.0"
   win32_registry:
     dependency: transitive
     description:

+ 1 - 0
pubspec.yaml

@@ -195,6 +195,7 @@ flutter:
   assets:
     - assets/images/
     - assets/anim/
+    - assets/html/
 
   # An image asset can refer to one or more resolution-specific "variants", see
   # https://flutter.dev/assets-and-images/#resolution-aware