Browse Source

[new]增加js通信

zk 1 year ago
parent
commit
f5b2457ec6

+ 6 - 16
lib/module/talk/mindmap/controller.dart

@@ -1,23 +1,13 @@
-import 'package:webview_flutter/webview_flutter.dart';
 import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
 
-class MindMapController extends BaseController {
-  final WebViewController webViewController = WebViewController();
+import '../controller.dart';
 
+class MindMapController extends BaseController {
   final String? talkId;
 
-  MindMapController(this.talkId);
+  TalkController get talkController => Get.find<TalkController>(tag: talkId);
 
-  @override
-  void onInit() {
-    super.onInit();
-  }
-
-  @override
-  void onReady() {
-    super.onReady();
-    webViewController.setJavaScriptMode(JavaScriptMode.unrestricted);
-    webViewController.enableZoom(false);
-    webViewController.loadRequest(Uri.parse('https://markmap.js.org/repl'));
-  }
+  MindMapController(this.talkId);
 }

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

@@ -4,7 +4,7 @@ import 'package:flutter/src/widgets/framework.dart';
 import 'package:get/get.dart';
 import 'package:get/get_core/src/get_main.dart';
 
-import 'package:webview_flutter/webview_flutter.dart';
+import '../mindview/view.dart';
 
 class MindMapView extends BasePage<MindMapController> {
   final String? talkId;
@@ -18,6 +18,6 @@ class MindMapView extends BasePage<MindMapController> {
 
   @override
   Widget buildBody(BuildContext context) {
-    return WebViewWidget(controller: controller.webViewController);
+    return MindView('');
   }
 }

+ 39 - 0
lib/module/talk/mindview/controller.dart

@@ -0,0 +1,39 @@
+import 'package:dsbridge_flutter/dsbridge_flutter.dart';
+import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/module/talk/mindview/js_api.dart';
+import 'package:webview_flutter/webview_flutter.dart';
+import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.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'));
+
+    webViewController.addJavaScriptObject(JsMindApi());
+    // webViewController.callHandler(JsMindApi.functionUpdateMind, args: []);
+    Future.delayed(const Duration(seconds: 1), () {
+      webViewController
+          .callHandler(JsMindApi.functionExport, args: ['test.svg']);
+    });
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+  }
+}

+ 16 - 0
lib/module/talk/mindview/js_api.dart

@@ -0,0 +1,16 @@
+import 'dart:io';
+
+import 'package:dsbridge_flutter/dsbridge_flutter.dart';
+
+class JsMindApi extends JavaScriptNamespaceInterface {
+  static const String functionUpdateMind = "updateValue";
+  static const String functionExport = "export";
+
+  @override
+  void register() {
+    registerFunction((dynamic msg) {}, functionName: functionUpdateMind);
+    registerFunction(export, functionName: functionExport);
+  }
+
+  void export(dynamic exportSvg) {}
+}

+ 16 - 0
lib/module/talk/mindview/view.dart

@@ -0,0 +1,16 @@
+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
+  Widget buildBody(BuildContext context) {
+    return DWebViewWidget(controller: controller.webViewController);
+  }
+}

+ 2 - 0
lib/router/app_pages.dart

@@ -34,6 +34,7 @@ import '../module/modelexplain/controller.dart';
 import '../module/record/view.dart';
 import '../module/splash/view.dart';
 import '../module/talk/controller.dart';
+import '../module/talk/mindview/controller.dart';
 
 abstract class AppPage {
   static final pages = <GetPage>[
@@ -96,6 +97,7 @@ class AppBinding extends Bindings {
     lazyPut(() => AudioPickerController());
     lazyPut(() => ComplaintOpinionController());
     lazyPut(() => ModelExplainController());
+    lazyPut(() => MindViewController());
   }
 
   void lazyPut<S>(InstanceBuilderCallback<S> builder) {

+ 8 - 0
pubspec.lock

@@ -404,6 +404,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.0.0"
+  dsbridge_flutter:
+    dependency: "direct main"
+    description:
+      name: dsbridge_flutter
+      sha256: "284cc23a31c7a315a13cc49c638d3bd9649a9b4555f69a817157710da37a520a"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.0"
   fake_async:
     dependency: transitive
     description:

+ 3 - 0
pubspec.yaml

@@ -145,6 +145,9 @@ dependencies:
   #notification
   flutter_local_notifications: ^17.2.3
 
+  #web通信
+  dsbridge_flutter: ^1.1.0
+
 dev_dependencies:
   flutter_test:
     sdk: flutter