0


flutter开发实战-webview_flutter 4.x版本使用

flutter开发实战-webview_flutter 4.x版本使用

在之前使用的webview_flutter版本是3.x的,升级到4.x后,使用方式有所变化。
在这里插入图片描述

一、webview_flutter

在工程的pubspec.yaml中引入插件

  1. webview_flutter: ^4.4.2

二、使用webview_flutter

在4.x版本中,我们使用WebViewController来监听加载的状态

代码如下

  1. controller
  2. ..setJavaScriptMode(JavaScriptMode.unrestricted)
  3. ..setBackgroundColor(const Color(0x00000000))
  4. ..setNavigationDelegate(
  5. NavigationDelegate(
  6. onProgress: (int progress) {
  7. debugPrint('WebView is loading (progress : $progress%)');
  8. },
  9. onPageStarted: (String url) {
  10. debugPrint('Page started loading: $url');
  11. },
  12. onPageFinished: (String url) {
  13. debugPrint('Page finished loading: $url');
  14. },
  15. onWebResourceError: (WebResourceError error) {
  16. debugPrint('''
  17. Page resource error:
  18. code: ${error.errorCode}
  19. description: ${error.description}
  20. errorType: ${error.errorType}
  21. isForMainFrame: ${error.isForMainFrame}
  22. ''');
  23. },
  24. onNavigationRequest: (NavigationRequest request) {
  25. if (request.url.startsWith('https://') ||
  26. request.url.startsWith('http://')) {
  27. return NavigationDecision.navigate;
  28. }
  29. return NavigationDecision.prevent;
  30. },
  31. onUrlChange: (UrlChange change) {
  32. debugPrint('url change to ${change.url}');
  33. },
  34. // onHttpAuthRequest: (HttpAuthRequest request) {
  35. // openDialog(request);
  36. // },
  37. ),
  38. )
  39. ..addJavaScriptChannel(
  40. 'Toaster',
  41. onMessageReceived: (JavaScriptMessage message) {
  42. ScaffoldMessenger.of(context).showSnackBar(
  43. SnackBar(content: Text(message.message)),
  44. );
  45. },
  46. )
  47. ..loadRequest(Uri.parse('https://baidu.com'));
  48. // #docregion platform_features
  49. if (controller.platform is AndroidWebViewController) {
  50. AndroidWebViewController.enableDebugging(true);
  51. (controller.platform as AndroidWebViewController)
  52. .setMediaPlaybackRequiresUserGesture(false);
  53. }
  54. // #enddocregion platform_features
  55. _controller = controller;

注意这个addJavaScriptChannel,之前3.x版本中有一个JavaScriptChannel类,在4.x版本中没有了。

这个JavaScriptChannel可以方便实现与JS的交互

  1. finalWebViewController controller =WebViewController();
  2. controller.addJavaScriptChannel('Print',
  3. onMessageReceived:(JavaScriptMessage message){print(message.message);},);

JavaScript可以这样调用:

  1. Print.postMessage('Hello');

我们为了方便JS与flutter调用,需要改造一下。使用JSBridge实现逻辑来嵌套使用该JavaScriptChannel

4.x版本使用完整代码如下

  1. // Copyright 2013 The Flutter Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. // ignore_for_file: public_member_api_docs
  5. import 'dart:async';
  6. import 'dart:convert';
  7. import 'dart:io';
  8. import 'dart:typed_data';
  9. import 'package:flutter/material.dart';
  10. import 'package:path_provider/path_provider.dart';
  11. import 'package:webview_flutter/webview_flutter.dart';
  12. // #docregion platform_imports
  13. // Import for Android features.
  14. import 'package:webview_flutter_android/webview_flutter_android.dart';
  15. // Import for iOS features.
  16. import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';
  17. // #enddocregion platform_imports
  18. class WebViewPage extends StatefulWidget {
  19. const WebViewPage({super.key});
  20. @override
  21. State<WebViewPage> createState() => _WebViewPageState();
  22. }
  23. class _WebViewPageState extends State<WebViewPage> {
  24. late final WebViewController _controller;
  25. @override
  26. void initState() {
  27. super.initState();
  28. // #docregion platform_features
  29. late final PlatformWebViewControllerCreationParams params;
  30. if (WebViewPlatform.instance is WebKitWebViewPlatform) {
  31. params = WebKitWebViewControllerCreationParams(
  32. allowsInlineMediaPlayback: true,
  33. mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},
  34. );
  35. } else {
  36. params = const PlatformWebViewControllerCreationParams();
  37. }
  38. final WebViewController controller =
  39. WebViewController.fromPlatformCreationParams(params);
  40. // #enddocregion platform_features
  41. controller
  42. ..setJavaScriptMode(JavaScriptMode.unrestricted)
  43. ..setBackgroundColor(const Color(0x00000000))
  44. ..setNavigationDelegate(
  45. NavigationDelegate(
  46. onProgress: (int progress) {
  47. debugPrint('WebView is loading (progress : $progress%)');
  48. },
  49. onPageStarted: (String url) {
  50. debugPrint('Page started loading: $url');
  51. },
  52. onPageFinished: (String url) {
  53. debugPrint('Page finished loading: $url');
  54. },
  55. onWebResourceError: (WebResourceError error) {
  56. debugPrint('''
  57. Page resource error:
  58. code: ${error.errorCode}
  59. description: ${error.description}
  60. errorType: ${error.errorType}
  61. isForMainFrame: ${error.isForMainFrame}
  62. ''');
  63. },
  64. onNavigationRequest: (NavigationRequest request) {
  65. if (request.url.startsWith('https://') ||
  66. request.url.startsWith('http://')) {
  67. return NavigationDecision.navigate;
  68. }
  69. return NavigationDecision.prevent;
  70. },
  71. onUrlChange: (UrlChange change) {
  72. debugPrint('url change to ${change.url}');
  73. },
  74. // onHttpAuthRequest: (HttpAuthRequest request) {
  75. // openDialog(request);
  76. // },
  77. ),
  78. )
  79. ..addJavaScriptChannel(
  80. 'Toaster',
  81. onMessageReceived: (JavaScriptMessage message) {
  82. ScaffoldMessenger.of(context).showSnackBar(
  83. SnackBar(content: Text(message.message)),
  84. );
  85. },
  86. )
  87. ..loadRequest(Uri.parse('https://baidu.com'));
  88. // #docregion platform_features
  89. if (controller.platform is AndroidWebViewController) {
  90. AndroidWebViewController.enableDebugging(true);
  91. (controller.platform as AndroidWebViewController)
  92. .setMediaPlaybackRequiresUserGesture(false);
  93. }
  94. // #enddocregion platform_features
  95. _controller = controller;
  96. }
  97. @override
  98. Widget build(BuildContext context) {
  99. return Scaffold(
  100. backgroundColor: Colors.green,
  101. appBar: AppBar(
  102. title: const Text('Flutter WebView example'),
  103. // This drop down menu demonstrates that Flutter widgets can be shown over the web view.
  104. ),
  105. body: WebViewWidget(controller: _controller),
  106. );
  107. }
  108. }

三、小结

flutter开发实战-webview_flutter 4.x版本使用

学习记录,每天不停进步。


本文转载自: https://blog.csdn.net/gloryFlow/article/details/138530263
版权归原作者 BruceGwo 所有, 如有侵权,请联系我们删除。

“flutter开发实战-webview_flutter 4.x版本使用”的评论:

还没有评论