flutter:webview_flutter和flutter_inappwebview的简单使用

news2024/11/14 15:25:26

前言

最近在研究如何在应用程序中嵌入Web视图,发现有两个库不错。
在这里插入图片描述
一个是官方维护、一个是第三方维护。因为没说特别的需求,就使用了官方库,实现一些简单功能是完全ok的

webview_flutter

不建议使用,因为效果不怎么样,当然也可能是我太菜不会用,下面这个问题就很难理解为什么会这样?
在这里插入图片描述

基本使用

官方文档

https://pub-web.flutter-io.cn/packages/webview_flutter

安装

flutter pub add webview_flutter

加载并显示web
可以加载html字符串,也可以直接加载url链接。官方都提供了对应的方法,这里演示加载url

  • 初始化
 late WebViewController webViewController;

  //初始化
  
  void initState() {
    super.initState();
    webViewController = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted);
  }
  • 显示
    显示的时候一般需要结合FutureBuilder,比较这是一个异步的过程
FutureBuilder(
     // 异步方法
     future: searchNovelFromWeb(),
     builder: (context, snapshot) {
       // 等待状态显示的widget
       if (snapshot.connectionState == ConnectionState.waiting) {
         return const Center(
           child: CircularProgressIndicator(),
         );
         //  错误时显示的widget
       } else if (snapshot.hasError) {
         return const Text('Error');
       } else {
         return snapshot.data ?? const Text('No data');
       }
     }))


  Future<Widget> searchNovelFromWeb() async {
    Widget res;
    try {
      await webViewController
          .loadRequest(Uri.parse('https://m.bbxxxxxx.com/s?q=凡人修仙'));
      res = WebViewWidget(controller: webViewController);
    } catch (error) {
      res = Text("加载失败:${error.toString()}");
      print("加载失败:${error.toString()}");
    }
    return res;
  }

在这里插入图片描述
在这里插入图片描述

flutter与web之间的交互

flutter通知web,让web执行某些操作

官方提供了两个方法:runJavaScriptrunJavaScriptReturningResult。后者可以向flutter返回执行结果
比如在网页加载完成后获取到网页源代码

webViewController.setNavigationDelegate(
      NavigationDelegate(onPageFinished: (url) async {
    print("页面加载完成:$url");
       
     var html = await webViewController.runJavaScriptReturningResult(
       "document.documentElement.innerText;");
      debugPrint("结果是11:$html", wrapWidth: 1024);
  }));

在这里插入图片描述

web发生变化后,通知flutter
这块也实现了,但是不太稳定,有时候不能够正常运行

 await webViewController
          .loadRequest(Uri.parse('https://m.bbxxxxxxxt.com/s?q=凡人修仙'));
      webViewController.setNavigationDelegate(
          NavigationDelegate(onPageFinished: (url) async {
        print("页面加载完成:$url");

        // 添加监听
         await webViewController.addJavaScriptChannel('Report',
             onMessageReceived: (JavaScriptMessage message) {
           print("收到了消息,是:${message.message}");
         });
         // 注入脚本
         await  webViewController.runJavaScript('''
            setInterval(() => {
              let time = new Date().toLocaleTimeString();
               Report.postMessage(time);
           },1000)
         ''');
      }));

在这里插入图片描述

flutter_inappwebview

功能更多,这里只会简单介绍一下,具体使用可以查看官方文档、官方案例。

强烈推荐:功能更多,而且原来使用webview_flutter无法实现的功能,现在轻而易举的实现了。

官方文档

官方案例

安装

flutter pub add flutter_inappwebview

基本使用

这里遇到个问题,版本过高导致构建失败了。我现在用的版本是:5.6.0

// 将html字符串解析为dom的库
import 'package:html/parser.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

late InAppWebViewController inAppWebViewController;
res = InAppWebView(
   initialUrlRequest:
       URLRequest(url: Uri.parse('https://onion.inscode.cc/')),
   onLoadStop: (controller, url) async {
     // 加载完成
     inAppWebViewController = controller;
     print("加载地址:$url");
     var html = await controller.getHtml();
     debugPrint("html是:${html.toString().trim()}");
     var dom = parse(html);
     print("标题是:${dom.querySelector('.title')?.text}");
   },
 );

在这里插入图片描述

执行脚本

要等页面加载完成后才能执行

 // 执行脚本
 var body = await inAppWebViewController.evaluateJavascript(
     source: "document.body.innerHTML");
 debugPrint("执行结果:${body.toString().trim()}");

在这里插入图片描述

遇到的问题

最开始我的想法是执行函数,然后更新要显示的组件,但是resBody 一直没有更新。后来发现好像是onLoadStop没有执行,仔细思考后应该是InAppWebView初始化后,没有在页面上显示导致后续方法没有执行。解决方法就是让InAppWebView在页面上显示,当然可能不想在页面显示,这时给它父容器设置一个高度比如1,这样就可以解决这个问题。

  Future searchNovelFromWeb() async {
    String html = '';
    InAppWebView(
      initialUrlRequest:
          URLRequest(url: Uri.parse('https://onion.inscode.cc/')),
      onLoadStop: (controller, url) async {
        inAppWebViewController = controller;
        print("开始搜索了");
        html = await inAppWebViewController.getHtml() ?? '1111';

        debugPrint("查询的值:${html.toString()}");
        setState(() {
          resBody = const Text("搜索完成");
        });
      },
    );
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/902190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wps设置其中几页为横版

问题&#xff1a;写文档的时候&#xff0c;有些表格列数太多&#xff0c;纵向显示内容不完整&#xff0c;可以给它改成横向显示。 将鼠标放在表格上一页的底部&#xff0c;点击‘插入-分页-下一页分节符’。 将鼠标放在表格页面的底部&#xff0c;点击‘插入-分页-下一页分节符…

qt显示图片并转换成灰度图及伪彩图

写了个程序&#xff0c;可在途图片&#xff0c;并切换成灰度图及伪彩图显示&#xff0c;主要代码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainW…

Java日常的String、Date、计算问题

一、String相关类 三者执行速度&#xff1a;StringBuilder > StringBuffer > String 1.1、String 每次对 String 类型改变的时&#xff0c;都会生成一个新的 String 对象&#xff0c;指针指向新的 String 对象。 适用于字符串不常变的&#xff0c;少量的数据场景中&am…

每日一题 143重排链表

题目 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交…

【Linux】-进程概念之进程地址空间的万字详解(解决一个变量怎么保存不同数据的问题)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

Java程序设计——编写计算器

设计主类 Calculator import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Objects;import javax.swing.*;//Calculator类&#xff0c;继承JFrame框架&#xff0c;实现事件监听器接口 public class Calculator e…

如何快速制作一个房地产电子传单?

在如今高度数字化的时代&#xff0c;电子传单成为了宣传推广的一种重要方式。下面将介绍如何利用乔拓云平台快速制作一个房地产电子传单。 第一步&#xff0c;找一个可靠的第三方制作平台/工具&#xff0c;比如乔拓云平台。乔拓云平台是一个功能强大、简单易用的电子传单制作工…

SpringBoot+微信小程序奶茶在线点单小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot微信小程序框架开发的奶茶在线点单小程序系统。首先&#xff0c;这是一个前后端分离的项目&#xff…

2023年,IT人都在追寻什么样的科技和技术?

摘要&#xff1a; 随着科技的不断发展&#xff0c;IT领域也在以惊人的速度发展。每年都会有新的技术和趋势出现&#xff0c;成为IT人士关注和追逐的对象。那么&#xff0c;在2023年&#xff0c;IT人都在追寻什么样的科技和技术呢&#xff1f;本文将探索2023年IT 人士最热衷的科…

SpringBoot---内置Tomcat 配置和切换

&#x1f600;前言 本篇博文是关于内置Tomcat 配置和切换&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x…

4 STM32标准库函数 之 FLASH存储器(FLASH)所有函数的介绍及使用

3 STM32标准库函数 之 FLASH存储器所有函数的介绍及使用 1. 图片有格式2 文字无格式二、FLASH 库函数固件库函数预览2.1 函数FLASH_SetLatency2.2 函数FLASH_HalfCycleAccessCmd2.3 函数FLASH_PrefetchBufferCmd2.4 函数FLASH_Unlock2.5 函数FLASH_Lock2.6 函数FLASH_ErasePage…

LeetCode 2236. 判断根结点是否等于子结点之和

【LetMeFly】2236.判断根结点是否等于子结点之和 力扣题目链接&#xff1a;https://leetcode.cn/problems/root-equals-sum-of-children/ 给你一个 二叉树 的根结点 root&#xff0c;该二叉树由恰好 3 个结点组成&#xff1a;根结点、左子结点和右子结点。 如果根结点值等于…

【数据分析入门】Matplotlib

目录 零、图形解析与工作流0.1 图形解析0.2 工作流 一、准备数据1.1 一维数据1.2 二维数据或图片 二、绘制图形2.1 画布2.2 坐标轴 三、绘图例程3.1 一维数据3.2 向量场3.3 数据分布3.4 二维数据或图片 四、自定义图形4.1 颜色、色条与色彩表4.2 标记4.3 线型4.4 文本与标注4.5…

Zoho CRM有哪些特点?

企业想要选择一款CRM系统&#xff0c;只看CRM公司排名或CRM厂商排名可以吗&#xff1f;其实&#xff0c;选型时的误区就是盲目选择大品牌&#xff0c;反而忽略了CRM和业务的适配度&#xff0c;毕竟适合的才是最好的。。 Zoho CRM是一款国际知名的SaaS云端CRM系统&#xff0c;面…

阿里云访问端口被限制解决方法记录

阿里云服务器&#xff0c;80端口可以访问&#xff0c;但是加入了安全组端口8080 通过公网访问改端口策略&#xff0c;发现不能被访问 问题出在防火墙&#xff0c;需要重置一下 解决方法&#xff1a; 在运行的服务器上执行如下命令&#xff1a; # iptables -A INPUT -j ACCEP…

23年9月到24年3月苹果产品发布

2023年到2024年的苹果产品发布 9月 基本就是手机&#xff0c;4款&#xff1a;15、15plus、15pro、15pro max 手表和ipodmini 10月就是新的M3芯片&#xff0c;至于M pro芯片会放在24年的3月份。 其他的就没什么新意了

课程项目设计--项目设计--宿舍管理系统--vue+springboot完成项目--项目从零开始

写在前面&#xff1a; 本文是从项目设计到完成开始写的&#xff0c;本来这个项目基础功能是做完了的&#xff0c;但是之前时间紧张想从头做起了。之前一周写前端后端累死了. 设计是关键&#xff0c;这一篇主讲设计。可能后面会有修改&#xff0c;本人实力有限&#xff0c;如有…

【微信小程序】下拉刷新功能实现

微信小程序开发系列 文章目录 前言一、onPullDownRefresh函数二、实现1.开启下拉刷新2.监听下拉事件 前言 在开发微信小程序中经常会需要下拉页面进行更新要页面数据的功能&#xff0c;微信小程序提供了onPullDownRefresh函数。该函数作用是监听用户下拉动作。 一、onPullDown…

【多线程】 —— 线程池

文章目录 1、什么是线程池&#xff0c;线程池有哪些&#xff08;创建&#xff09;(1) newCachedThreadPool(2) newFixedThreadPool(3) newSingleThreadExecutor(4) newScheduleThreadPool 2、为什么要使用线程池&#xff1f;3、线程池底层工作原理4、ThreadPoolExecutor 对象有…