From 9afdb0e29cd534d7783521d17f876a80c5974715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9B=AE=E6=A3=83?= Date: Tue, 13 Aug 2024 14:54:29 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=B1=20flutter=20=E4=B8=8E=20webview=20?= =?UTF-8?q?=E9=80=9A=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/lib/test.html | 51 +++++++++++++++++++++++++++++++++++++ lib/pages/main/app_dev.dart | 14 ++++++---- lib/tools/file_tool.dart | 12 +++++++++ lib/ui/sp_webview.dart | 14 ++++++++++ pubspec.yaml | 1 + 5 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 assets/lib/test.html diff --git a/assets/lib/test.html b/assets/lib/test.html new file mode 100644 index 0000000..d732cc5 --- /dev/null +++ b/assets/lib/test.html @@ -0,0 +1,51 @@ + + + + + + + + +

Alert Messages

+ +

Click on the "x" symbol to close the alert message.

+
+ × + Danger! Indicates a dangerous or potentially negative action. +
+

Click the button to display an alert box.

+ + + + \ No newline at end of file diff --git a/lib/pages/main/app_dev.dart b/lib/pages/main/app_dev.dart index fa8a5bf..2e84a66 100644 --- a/lib/pages/main/app_dev.dart +++ b/lib/pages/main/app_dev.dart @@ -3,6 +3,8 @@ import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; // Project imports: +import '../../tools/file_tool.dart'; +import '../../tools/log_tool.dart'; import '../../ui/sp_webview.dart'; /// 测试页面 @@ -21,12 +23,14 @@ class _AppDevPageState extends ConsumerState { /// 创建新窗口 Future createNewWindow() async { if (!mounted) return; - controller = await SpWebview.createWebview( - context, - 'https://www.baidu.com', - ); + var fileTool = SPFileTool(); + var filePath = await fileTool.getAssetsPath('lib/test.html'); if (!mounted) return; - await controller!.show(context); + controller = await SpWebview.createWebview(context, filePath); + controller!.listen('message', callback: (event) { + SPLogTool.info('[Webview] Receive message: $event'); + }); + if (mounted) await controller!.show(context); } /// 构建函数 diff --git a/lib/tools/file_tool.dart b/lib/tools/file_tool.dart index cf13840..a42b3a1 100644 --- a/lib/tools/file_tool.dart +++ b/lib/tools/file_tool.dart @@ -34,6 +34,18 @@ class SPFileTool { return path.join(dir, relativePath); } + /// 获取assets目录下的文件路径 + Future getAssetsPath(String relativePath) async { + var assetsPath = path.join( + path.dirname(Platform.resolvedExecutable), + 'data', + 'flutter_assets', + 'assets', + relativePath, + ); + return Uri.file(assetsPath).toString(); + } + /// 检测文件是否存在 Future isFileExist(String path) async { return File(path).exists(); diff --git a/lib/ui/sp_webview.dart b/lib/ui/sp_webview.dart index ec4f2f7..e88c390 100644 --- a/lib/ui/sp_webview.dart +++ b/lib/ui/sp_webview.dart @@ -93,6 +93,13 @@ class SpWebviewController extends ChangeNotifier { icon: const Icon(FluentIcons.chrome_close), onPressed: () => Navigator.pop(context), ), + IconButton( + icon: const Icon(FluentIcons.chrome_restore), + onPressed: () async { + var data = '{"message": "Hello, Flutter!"}'; + await webview.postWebMessage(data); + }, + ) ], ), constraints: BoxConstraints( @@ -118,6 +125,13 @@ class SpWebviewController extends ChangeNotifier { webview.dispose(); notifyListeners(); } + + void listen(String event, {Function(dynamic)? callback}) { + webview.webMessage.listen((event) { + if (event == null) return; + if (callback != null) callback(event); + }); + } } class SpWebview extends StatefulWidget { diff --git a/pubspec.yaml b/pubspec.yaml index b9266bd..0240567 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -103,6 +103,7 @@ flutter: assets: - assets/fonts/ - assets/images/ + - assets/lib/ - assets/schema/ # An image asset can refer to one or more resolution-specific "variants", see