Flutter与Webview交互

这篇具有很好参考价值的文章主要介绍了Flutter与Webview交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

flutter层不支持webview,加载网页的功能还需要借助控件来处理。

通过pub.dev搜索以及对比网上文章,发现了几个比较受欢迎的flutter webview插件;

Flutter与Webview交互
Flutter与Webview交互

这三种插件对比图(此图借鉴自网络)

Flutter与Webview交互

这里详细介绍使用flutter_inappwebview5.3.2版本插件完成交互;

注意:flutter_inappwebview6.xx 版本flutter3.0以下不支持;

控件地址:https://pub.dev/packages/flutter_inappwebview。

1.安装插件

1)在配置文件pubbspec.yaml中加 flutter_inappwebview: 5.3.2;然后运行flutter pub get同步插件;

  flutter_inappwebview: 5.3.2
Flutter与Webview交互

2.配置

1)在入口文件main.dart中加入

 // 不加这个强制横/竖屏会报错
  WidgetsFlutterBinding.ensureInitialized();  
Flutter与Webview交互

3.主要类概览

该插件主要提供了以下类:

  • InAppWebView :一个 Flutter 小部件,用于添加整合到 Flutter 部件树的内联原生 WebView。

  • ContextMenu :该类表示 WebView 的快捷菜单。

  • HeadlessInAppWebView :该类表示处于 headless 模式的 WebView。它可以用来在后台运行 WebView,而无需将 InAppWebView 附加到部件树中。

  • InAppBrowser :使用原生 WebView 的 In-App Browser。

  • ChromeSafariBrowser :使用 Chrome Custom Tabs (Android)和 SFSafariViewController (iOS)的 In-App Browser。

  • InAppLocalhostServer :该类让你可以创建一个简单的服务器: http://localhost:[port]/ . ,默认 port 为 8080 。

  • CookieManager :这个类实现了一个单例对象(共享实例),管理 WebView 实例使用的 cookie。

  • HttpAuthCredentialDatabase :该类实现一个管理共享 HTTP 身份验证凭据缓存的单例对象(共享实例)。

  • WebStorageManager :该类生成一个管理 Web 存储(供 WebView 实例使用)的单例对象(共享实例)。

  • ......

4.使用

(1)加载webview视图

1)展示一个url的视图内容

flutter代码如下:

Flutter与Webview交互

app上呈现的效果图:

Flutter与Webview交互

2) 展示一个html视图内容

html代码如下:

Flutter与Webview交互

flutter代码:

Flutter与Webview交互

在app上呈现的效果:

Flutter与Webview交互

3)在flutter代码中处理你url文件或html文件的某个demo结构

以html文件为例,我想要在箭头所指的demo结构处添加文字内容“12345678910”和一些样式

Flutter与Webview交互

那么在flutter代码中添加

//在InAppWebView配置项中添加
   onPageCommitVisible: (inAppWebViewControlle, uri) async {
   //_loadPage是声明的一个全局bool类型变量
          if (_loadPage) {
            setState(() {
              _loadPage = false;
            });
            //获取到webview的所有html结构
            var fileHtmlContents = await webViewController!.getHtml();
            //找到带有某种唯一标识的demo结构并替换它
            fileHtmlContents = fileHtmlContents!.replaceAll(
              '<div class="flutter-view"></div>',
              "<div class='flutter-view' style='width: 200px; height: 200px;background-color: green;'>12345678910</div>",
            );
            //重新渲染结构
            webViewController!.loadData(data: fileHtmlContents);
          }
        },

效果:

Flutter与Webview交互

(2)与js交互传参

在flutter代码中添加

    //添加在InAppWebView配置项里
    // InAppWebview中获取InAppWebViewController
        onWebViewCreated: (InAppWebViewController controller) {
          // 注册一个JS处理方法,名称为myHandlerName
          controller.addJavaScriptHandler(
              handlerName: 'myHandlerName',
              callback: (args) {
                // 打印js方传递过来的参数
                print('args=js方传递过来的参数============================$args');
                // 传给js方的参数
                // 可以传递你所需要的任意类型数据,数组、对象等
                return "flutter给js的数据";
              });
        },
 //这个方法可以打印js中的conse.log内容
 onConsoleMessage: (controller, consoleMessage) {
          //这里是打印来自于js的conse.log打印
          print("consoleMessage==来自于js的打印====$consoleMessage");
        },

在js代码中添加

       // 下面的"flutterInAppWebViewPlatformReady"为固定写法
       // "myHandlerName"与flutter中注册的JS处理方法名称一致
        window.addEventListener("flutterInAppWebViewPlatformReady", function () {
            window.flutter_inappwebview
                                               //可以传递你所需要的任意类型数据,数组、对象等
                .callHandler("myHandlerName", "这里是传给flutter的参数")
                .then(function (res) {
                    console.log("res========flutter给html的数据", res);
                })
        })

flutter控制台输出:

Flutter与Webview交互

传递数据成功啦,可以开始你对这些数据的处理啦。

注意:每次修改了html文件代码都需要终止flutter项目进程重新启动,否则你将看不到你的改动效果。

(3)完整demo代码

flutter代码

import 'package:flutter/cupertino.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

class HomePage extends StatefulWidget {
  HomePage({Key? key, required this.url}) : super(key: key);
  String url;
  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  bool _loadPage = true;
  InAppWebViewController? webViewController;

  // GlobalKey可以获取到对应的Widget的State对象!
  // 当我们页面内容很多时,而需要改变的内容只有很少的一部分且在树的底层的时候,我们如何去实现增量更新?
  // 通常情况下有两种方式,第一种是通过方法的回调,去实现数据更新,第二种是通过GlobalKey,
  final GlobalKey webViewKey = GlobalKey();
  // webview配置
  InAppWebViewGroupOptions options = InAppWebViewGroupOptions(
    // 跨平台配置
    crossPlatform: InAppWebViewOptions(
      useShouldOverrideUrlLoading: true,
      mediaPlaybackRequiresUserGesture: false,
    ),
    // android平台配置
    android: AndroidInAppWebViewOptions(
      //支持HybridComposition
      useHybridComposition: true,
    ),
    // ios平台配置
    ios: IOSInAppWebViewOptions(
      allowsInlineMediaPlayback: true,
    ),
  );
  @override
  Widget build(BuildContext context) {
    return Container(
      child: InAppWebView(
        key: webViewKey,
        initialFile: 'lib/assets/html/demo.html',
       // initialUrlRequest: URLRequest(url: Uri.parse("https://inappwebview.dev/")),
        initialOptions: options,
        // InAppWebview中获取InAppWebViewController
        onWebViewCreated: (InAppWebViewController controller) {
          webViewController = controller;
          // 注册一个JS处理方法,名称为myHandlerName
          controller.addJavaScriptHandler(
              handlerName: 'myHandlerName',
              callback: (args) {
                // 打印js方传递过来的参数
                print('args=js方传递过来的参数============================$args');
                // 传给js方的参数
                return "flutter给js的数据";
              });
        },
        onConsoleMessage: (controller, consoleMessage) {
          //这里是打印来自于js的conse.log打印
          print("consoleMessage==来自于js的打印====$consoleMessage");
        },
        onPageCommitVisible: (inAppWebViewControlle, uri) async {
          if (_loadPage) {
            setState(() {
              _loadPage = false;
            });
            var fileHtmlContents = await webViewController!.getHtml();
            fileHtmlContents = fileHtmlContents!.replaceAll(
              '<div class="flutter-view"></div>',
              "<div class='flutter-view' style='width: 200px; height: 200px;background-color: green;'>12345678910</div>",
            );
            webViewController!.loadData(data: fileHtmlContents);
          }
        },
      ),
    );
  }
}

html代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>demo</title>
    <script>
        // 下面的"flutterInAppWebViewPlatformReady"为固定写法
        // "myHandlerName"与flutter中注册的JS处理方法名称一致
        window.addEventListener("flutterInAppWebViewPlatformReady", function () {
            window.flutter_inappwebview
                .callHandler("myHandlerName", "这里是传给flutter的参数")
                .then(function (res) {
                    console.log("res========flutter给html的数据", res);
                })
        })
    </script>
</head>

<body>
    <h1>我是一个demo</h1>
    <h1>我是一个html文件</h1>
    <h1>我想展示在flutter应用里</h1>
    <div class="flutter-view"></div>
</body>

</html>

5.常见问题

下载完插件直接运行会报错,需要根据报错提示修改配置;

1)在项目文件-->android-->app-->build.gradle中,变量值固定数值参考报错信息,建议为大于等于报错提示信息中的数值。文章来源地址https://www.toymoban.com/news/detail-415052.html

android {
    compileSdkVersion 31
    
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 28
    }
}

到了这里,关于Flutter与Webview交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 封装flutter webview页面

    例如在flutter里面跳转百度页面 需要安装webview_flutter webview_page.dart 使用

    2024年02月03日
    浏览(41)
  • webview_flutter

    查看webview内核 ​https://liulanmi.com/labs/core.html​ h5中获取设备 https://cloud.tencent.com/developer/ask/sof/105938013 https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/mediaDevices web资源部署后navigator获取不到mediaDevices实例的解决方案(navigator.mediaDevices为undefined)_navigator.mediadevices不存在_乐辞的博

    2024年02月07日
    浏览(37)
  • flutter开发实战-webview插件flutter_inappwebview使用

    flutter开发实战-webview插件flutter_inappwebview使用 在开发过程中,经常遇到需要使用WebView,Webview需要调用原生的插件来实现。常见的flutter的webview插件是webview_flutter,flutter_inappwebview。之前整理了一下webview_flutter,查看https://blog.csdn.net/gloryFlow/article/details/131683122 这里我们使用fl

    2024年02月07日
    浏览(51)
  • flutter:webview_flutter和flutter_inappwebview的简单使用

    最近在研究如何在应用程序中嵌入Web视图,发现有两个库不错。 一个是官方维护、一个是第三方维护。因为没说特别的需求,就使用了官方库,实现一些简单功能是完全ok的 不建议使用,因为效果不怎么样,当然也可能是我太菜不会用,下面这个问题就很难理解为什么会这样

    2024年02月12日
    浏览(55)
  • flutter 封装webview和使用本地网页

    最先看到flutter_webview_plugin 用法特别简单 flutter_webview_plugin | Flutter Package Plugin that allow Flutter to communicate with a native Webview. https://pub-web.flutter-io.cn/packages/flutter_webview_plugin 缺点: 没有实现js sdk的功能 没有办法 使用JavaScriptChannel 的功能 后面使用webview_flutter webview_flutter | Flutter

    2024年03月26日
    浏览(54)
  • 我的第一个flutter项目(Android & Webview)

    前言:flutter开发环境搭建Flutter的开发环境搭建-图解_☆七年的博客-CSDN博客 第一个flutter简单项目,内容是一个主界面,其中:     1.内容点击数字自增     2.跳转一个空页,     3.跳转一个WebView界面 其中涉及添加主键,新建界面类,导入依赖,使用WebView, 兼容http网络安全

    2024年02月15日
    浏览(74)
  • flutter ios webview不能打开http地址

    参考 1、iOS添加信任 webview_flutter 在使用过程中会iOS出现无法加载HTTP请求的情况, 但是Flutter 却可以加载HTTP请求。这就与两个的框架有关了,Flutter是独立于UIKit框架的。 解决方案就是在iOS 的info.plist中添加对HTTP的信任。 安卓的一些地址打不开 Flutter-Webview组件处理Scheme协议

    2024年02月11日
    浏览(40)
  • flutter开发实战-webview自定义标题栏Appbar

    flutter开发实战-webview定义标题栏Appbar 在开发中,使用到webview,在之前实现webview使用,webview页面使用的时自定义标题栏,在上一个webview结合JsBridge实现交互忘记这个标题栏,这里记录一下。 flutter开发实战-webview定义标题栏Appbar,PreferredSizeWidget webview页面使用的时自定义标题

    2024年02月16日
    浏览(39)
  • flutter开发实战-实现webview与Javascript通信JSBridge

    flutter开发实战-实现webview与H5中Javascript通信JSBridge 在开发中,使用到webview,flutter实现webview是使用原生的插件实现,常用的有webview_flutter与flutter_inappwebview 这里使用的是webview_flutter,在iOS上,WebView小部件由WKWebView支持。在Android上,WebView小部件由WebView支持。 这里使用的是w

    2024年02月14日
    浏览(43)
  • 跨端的三种方案原理和对比(WebView,ReactNative,Flutter)

    WebView是什么?  答: 第一代跨平台框架,代表者为:PhoneGap、微信小程序。 WebView标签是一种用于在网页中嵌入浏览器窗口的HTML元素。它的底层原理是通过 原生平台提供的浏览器引擎 来实现网页的渲染和交互。 在Android平台上,WebView使用的是Android系统提供的WebView组件,它

    2024年02月05日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包