From 09fb1af9a2109a852b6f2248ae94ecd06f8a92ca Mon Sep 17 00:00:00 2001 From: wuqifeng <540416539@qq.com> Date: Sun, 27 Oct 2024 12:50:21 +0800 Subject: [PATCH] feat:flutter_inappwebview升级 --- lib/app/splash_page.dart | 2 ++ lib/common/pages/wow_web_page.dart | 41 +++++++++++++++++++---------------------- lib/common/widgets/webview_dialog.dart | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------- pubspec.yaml | 2 +- 4 files changed, 72 insertions(+), 70 deletions(-) diff --git a/lib/app/splash_page.dart b/lib/app/splash_page.dart index 0f92c0e..c328e58 100644 --- a/lib/app/splash_page.dart +++ b/lib/app/splash_page.dart @@ -84,6 +84,8 @@ class _TransitionViewState extends State { child: WebviewDialog( title: "服务条款及隐私政策", webUrl: AppConsts.userPrivacyPolicyUrl, + leftButtonText: '同意并继续', + rightButtonText: '不同意,退出应用', leftTap: () { AppConfigHelper.saveAgreementAccepted(true); _initData(); diff --git a/lib/common/pages/wow_web_page.dart b/lib/common/pages/wow_web_page.dart index c843785..ad3b7f6 100644 --- a/lib/common/pages/wow_web_page.dart +++ b/lib/common/pages/wow_web_page.dart @@ -13,7 +13,7 @@ class WowWebViewPage extends StatefulWidget { WowWebViewPage({super.key, required this.urlStr, required this.webViewTitle}); final String urlStr; - String webViewTitle; + String? webViewTitle; @override State createState() { @@ -36,7 +36,7 @@ class _WowWebViewPageState extends State { double _progress = 0; bool isCanGoBack = false; bool isCanForward = false; - late final String defaultWebViewTitle = widget.webViewTitle; + late final String defaultWebViewTitle = widget.webViewTitle ?? ''; final String TAG = "WowWebViewPage"; // InAppWebViewSettings webViewSettings = InAppWebViewSettings( @@ -47,18 +47,15 @@ class _WowWebViewPageState extends State { // useHybridComposition: true, // allowsInlineMediaPlayback: true, // ); - InAppWebViewGroupOptions webViewSettings = InAppWebViewGroupOptions( - crossPlatform: InAppWebViewOptions( - useShouldOverrideUrlLoading: true, // 是否需要跳转 - mediaPlaybackRequiresUserGesture: false, // 设置为true,防止H5的音频自动播放 - transparentBackground: true, - ), - android: AndroidInAppWebViewOptions( - useHybridComposition: true, - mixedContentMode: AndroidMixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW), - ios: IOSInAppWebViewOptions( - allowsInlineMediaPlayback: true, - ), + InAppWebViewSettings webViewSettings = InAppWebViewSettings( + useShouldOverrideUrlLoading: true, + // 是否需要跳转 + mediaPlaybackRequiresUserGesture: false, + // 设置为true,防止H5的音频自动播放 + transparentBackground: true, + useHybridComposition: true, + mixedContentMode: MixedContentMode.MIXED_CONTENT_ALWAYS_ALLOW, + allowsInlineMediaPlayback: true, ); Future getUrl() { @@ -73,7 +70,7 @@ class _WowWebViewPageState extends State { return Future.sync(() => null); } return _inAppWebViewController! - .loadUrl(urlRequest: URLRequest(url: Uri.parse(url))); + .loadUrl(urlRequest: URLRequest(url: WebUri.uri(Uri.parse(url)))); } @override @@ -198,7 +195,7 @@ class _WowWebViewPageState extends State { // height: 40.h, // width: 40.w, // ), - icon: Icon(Icons.close), + icon: const Icon(Icons.close), onPressed: () { Navigator.pop(context); }, @@ -213,10 +210,10 @@ class _WowWebViewPageState extends State { child: InAppWebView( key: webViewKey, initialUrlRequest: URLRequest( - url: Uri.parse(widget.urlStr), + url: WebUri.uri(Uri.parse(widget.urlStr)), ), initialUserScripts: UnmodifiableListView([]), - initialOptions: webViewSettings, + initialSettings: webViewSettings, onWebViewCreated: (controller) { _inAppWebViewController = controller; }, @@ -266,13 +263,13 @@ class _WowWebViewPageState extends State { }) }); }, - onLoadError: (controller, request, code, message) { + onReceivedError: (controller, request, error) { Log.d( - "$TAG onReceivedError request=$request error=$code message=$message"); + "$TAG onReceivedError request=$request error=$error"); }, - onLoadHttpError: (controller, request, errorResponse, message) { + onReceivedHttpError: (controller, request, response) { Log.d( - "$TAG onReceivedError request=$request errorResponse=$errorResponse message=$message"); + "$TAG onReceivedError request=$request response=$response"); }, onProgressChanged: (controller, progress) { Log.d("$TAG onProgressChanged progress=$progress"); diff --git a/lib/common/widgets/webview_dialog.dart b/lib/common/widgets/webview_dialog.dart index e8faf9f..d526339 100644 --- a/lib/common/widgets/webview_dialog.dart +++ b/lib/common/widgets/webview_dialog.dart @@ -5,15 +5,20 @@ import 'package:flutter_inappwebview/flutter_inappwebview.dart'; class WebviewDialog extends StatelessWidget { final String title; final String webUrl; - final VoidCallback leftTap; - final VoidCallback rightTap; + final String? leftButtonText; + final String? rightButtonText; + final VoidCallback? leftTap; + final VoidCallback? rightTap; + InAppWebViewController? _inAppWebViewController; - const WebviewDialog( + WebviewDialog( {super.key, required this.title, required this.webUrl, - required this.leftTap, - required this.rightTap}); + this.leftButtonText, + this.rightButtonText, + this.leftTap, + this.rightTap}); @override Widget build(BuildContext context) { @@ -22,8 +27,8 @@ class WebviewDialog extends StatelessWidget { child: Text(title), ), content: SizedBox( - width: MediaQuery.of(context).size.height - 100, - height: MediaQuery.of(context).size.width - 100, + width: MediaQuery.of(context).size.height, + height: MediaQuery.of(context).size.height, child: FutureBuilder( // 异步方法 future: buildWebViewController(webUrl), @@ -40,28 +45,30 @@ class WebviewDialog extends StatelessWidget { return snapshot.data ?? const Text('No data'); } })), - actions: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - TextButton( - child: const Text('同意并继续', - style: TextStyle(color: Color(0xFFFBB621))), - onPressed: () { - // 处理接受按钮的点击事件 - leftTap(); // 关闭对话框 - }, - ), - TextButton( - child: const Text('不同意,退出应用'), - onPressed: () { - // 处理拒绝按钮的点击事件 - rightTap(); // 关闭对话框 - }, - ), - ], - ) - ], + actions: (leftButtonText == null && rightButtonText == null) + ? null + : [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TextButton( + child: Text(leftButtonText!, + style: const TextStyle(color: Color(0xFFFBB621))), + onPressed: () { + // 处理接受按钮的点击事件 + leftTap?.call(); // 关闭对话框 + }, + ), + TextButton( + child: Text(rightButtonText!), + onPressed: () { + // 处理拒绝按钮的点击事件 + rightTap?.call(); // 关闭对话框 + }, + ), + ], + ) + ], ); } @@ -94,24 +101,20 @@ class WebviewDialog extends StatelessWidget { // res = WebViewWidget(controller: controller); res = InAppWebView( - initialUrlRequest: URLRequest(url: Uri.parse(url)), - initialUserScripts: UnmodifiableListView([]), - initialOptions: InAppWebViewGroupOptions( - crossPlatform: InAppWebViewOptions( - useShouldOverrideUrlLoading: true, // 是否需要跳转 - mediaPlaybackRequiresUserGesture: false, // 设置为true,方式H5的音频自动播放 - transparentBackground: true - ), - android: AndroidInAppWebViewOptions( - useHybridComposition: true, - ), - ios: IOSInAppWebViewOptions( - allowsInlineMediaPlayback: true, - ), - ), - onWebViewCreated: (controller) { - // _inAppWebViewController = controller; - }, + initialUrlRequest: URLRequest(url: WebUri.uri(Uri.parse(url))), + initialUserScripts: UnmodifiableListView([]), + initialSettings: InAppWebViewSettings( + javaScriptEnabled: true, + javaScriptCanOpenWindowsAutomatically: true, + mediaPlaybackRequiresUserGesture: false, + transparentBackground: true, + useHybridComposition: true, + allowsInlineMediaPlayback: true, + useShouldOverrideUrlLoading: true, + ), + onWebViewCreated: (controller) { + _inAppWebViewController = controller; + }, ); } catch (error) { res = Text("加载失败:${error.toString()}"); diff --git a/pubspec.yaml b/pubspec.yaml index 0864fb5..cff0b2c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,7 +51,7 @@ dependencies: #网页加载 https://pub.dev/packages/webview_flutter # webview_flutter: ^4.8.0 #https://pub.dev/packages/flutter_inappwebview - flutter_inappwebview: 5.8.0 + flutter_inappwebview: 6.0.0 #下拉刷新 https://pub.dev/packages/pull_to_refresh pull_to_refresh: ^2.0.0 # 数据持久化 https://pub.dev/packages/shared_preferences -- libgit2 0.22.2