当前位置: 首页 > news >正文

Flutter 使用 flutter_inappwebview 加载 App 本地 HTML 文件

在 Flutter 开发中,加载本地 HTML 文件是一个常见的需求,尤其是在需要展示离线内容或自定义页面时。flutter_inappwebview 是一个功能强大的插件,支持加载本地文件和网络资源。本文将详细介绍如何使用 flutter_inappwebview 加载 App 本地 HTML 文件,包括传统加载资源文件的方法和从 App 目录加载文件的方法。

一、传统加载资源文件

  1. HTML 文件放置
    首先,将 .html 文件拖入工程中。通常,我会将文件放在工程的根目录下,与 pubspec.yaml 同级。
    然后,打开 pubspec.yaml 文件,在 assets: 下添加该文件,例如:
flutter:assets:- membership_agreement.html
  1. 加载本地 HTML 文件
    接下来,使用 rootBundle 读取文件内容,并通过 InAppWebView 加载 HTML 数据。
    dart复制
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:flutter_inappwebview/flutter_inappwebview.dart';class LocalHtmlPage extends StatefulWidget {final String html;LocalHtmlPage({required this.html});_LocalHtmlPageState createState() => _LocalHtmlPageState();
}class _LocalHtmlPageState extends State<LocalHtmlPage> {late InAppWebViewController _webViewController;Future<String> _getFile() async {return await rootBundle.loadString(widget.html);}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("加载本地 HTML 文件")),body: FutureBuilder<String>(future: _getFile(),builder: (context, snapshot) {if (snapshot.hasData) {final String htmlUrl = Uri.dataFromString(snapshot.data!,mimeType: 'text/html',encoding: Encoding.getByName('utf-8'),base64: true,).toString();return InAppWebView(initialUrlRequest: URLRequest(url: Uri.parse(htmlUrl)),onWebViewCreated: (controller) {_webViewController = controller;},onLoadStart: (controller, url) {print('开始加载: $url');},onLoadStop: (controller, url) {print('加载完毕: $url');},onConsoleMessage: (controller, consoleMessage) {print('Console message: ${consoleMessage.message}');},);}return Center(child: Text('读取失败'));},),);}
}

二、加载 App 目录文件

  1. 需求背景
    在某些场景下,HTML 文件可能需要先下载到 App 的本地目录,然后再从目录中加载。例如,从网络下载 HTML 文件并保存到本地缓存目录。
  2. 核心代码
    以下是使用 flutter_inappwebview 加载 App 目录中的 HTML 文件的完整代码示例:
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:path_provider/path_provider.dart';class LocalHtmlPage extends StatefulWidget {final String htmlFileName;LocalHtmlPage({required this.htmlFileName});_LocalHtmlPageState createState() => _LocalHtmlPageState();
}class _LocalHtmlPageState extends State<LocalHtmlPage> {late InAppWebViewController _webViewController;Future<File?> getLocalHtmlFile() async {final directory = await getApplicationDocumentsDirectory();final filePath = "${directory.path}/${widget.htmlFileName}";final file = File(filePath);if (await file.exists()) {return file;}return null;}Future<void> load() async {try {final file = await getLocalHtmlFile();if (file != null) {print('加载本地 HTML 文件: file://${file.path}');_webViewController.loadUrl(urlRequest: URLRequest(url: Uri.file(file.path)),);} else {print('文件不存在');}} catch (e, stackTrace) {print('加载本地 HTML 文件异常: $e');print(stackTrace);}}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("加载本地 HTML 文件")),body: InAppWebView(onWebViewCreated: (controller) {_webViewController = controller;load();},onLoadStart: (controller, url) {print('开始加载: $url');},onLoadStop: (controller, url) {print('加载完毕: $url');},onProgressChanged: (controller, progress) {print('WebView 加载中 (进度: $progress%)');},onConsoleMessage: (controller, consoleMessage) {print('Console message: ${consoleMessage.message}');},gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{Factory(() => EagerGestureRecognizer()),}.toSet(),),);}
}

三、注意事项
文件路径问题:
确保文件路径正确,并且文件确实存在于指定路径下。
如果文件路径是动态生成的,确保路径格式正确。
文件内容问题:
确保 HTML 文件内容是有效的,且没有语法错误。
可以在浏览器中直接打开该 HTML 文件,确认其是否正常显示。
iOS 网络权限:
如果加载的文件路径是 file://,确保 iOS 的网络权限配置正确。在 Info.plist 中添加以下配置:

<key>NSAppTransportSecurity</key>
<dict><key>NSAllowsArbitraryLoads</key><true/>
</dict>

日志输出:
如果需要关闭日志输出,可以在 Dart 代码中过滤日志消息,或在 iOS 和 Android 项目中配置日志级别。
通过以上方法,你可以灵活地使用 flutter_inappwebview 加载本地 HTML 文件,无论是通过资源文件还是从 App 目录加载。希望本文能帮助你更好地实现这一功能。

相关文章:

Flutter 使用 flutter_inappwebview 加载 App 本地 HTML 文件

在 Flutter 开发中&#xff0c;加载本地 HTML 文件是一个常见的需求&#xff0c;尤其是在需要展示离线内容或自定义页面时。flutter_inappwebview 是一个功能强大的插件&#xff0c;支持加载本地文件和网络资源。本文将详细介绍如何使用 flutter_inappwebview 加载 App 本地 HT…...

Word常见问题:嵌入图片无法显示完整

场景&#xff1a;在Word中&#xff0c;嵌入式图片显示不全&#xff0c;一部分图片在文字下方。如&#xff1a; 问题原因&#xff1a;因段落行距导致 方法一 快捷方式 选中图片&#xff0c;通过"ctrl1"快捷调整为1倍行距 方法二 通过工具栏调整 选中图片&#xff0…...

为AI聊天工具添加一个知识系统 之68 详细设计 之9 三种中台和时间度量 之1

本文要点 要点 在维度0上 被分离出来 的业务中台 需求、技术中台要求、和数据中台请求 &#xff08;分别在时间层/空间层/时空层上 对应一个不同种类槽的容器&#xff0c;分别表示业务特征Feature[3]/技术方面Aspect[3]/数据流Fluent[3]&#xff09; 在维度1~3的运动过程中 从…...

On to OpenGL and 3D computer graphics

2. On to OpenGL and 3D computer graphics 声明&#xff1a;该代码来自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;仅用作学习参考 2.1 First Program Square.cpp完整代码 /// // square.cpp // // OpenGL program to draw a squ…...

从曾国藩的经历看如何打破成长中的瓶颈

《曾国藩传》是一部充满智慧与人生哲理的传记&#xff0c;而曾国藩本人更是一个从“最笨”到“最智慧”的奇人。看他的成长与蜕变&#xff0c;不仅能感受到他如何超越自己的局限&#xff0c;也能从中获得关于人性、社会和历史的重要启示。曾国藩的一生让人深思&#xff0c;正是…...

JavaWeb学习-SpringBotWeb开发入门(HTTP协议)

(一)SpringBotWeb开发步骤 (1)创建springboot工程,并勾选开发相关依赖 (2)定义HelloController类,添加方法hello,并添加注解 (3)运行测试 (二)HTTP入门概述 创建请求页面 package com.itheima.demo3; /*请求处理类,加上注解标识为请求处理类*/import org.spr…...

数据库用户管理

数据库用户管理 1.创建用户 MySQL在安装是&#xff0c;会默认创建一个名位root的用户&#xff0c;该用户拥有超级权限&#xff0c;可以控制整个MySQL服务器。 在对MySQL的日常管理和操作中&#xff0c;通常创建一些具有适当权限的用户&#xff0c;尽可能的不用或少用root登录…...

BGP边界网关协议(Border Gateway Protocol)路由聚合详解

一、路由聚合 1、意义 在大规模的网络中&#xff0c;BGP路由表十分庞大&#xff0c;给设备造成了很大的负担&#xff0c;同时使发生路由振荡的几率也大大增加&#xff0c;影响网络的稳定性。 路由聚合是将多条路由合并的机制&#xff0c;它通过只向对等体发送聚合后的路由而…...

ASP.NET Core WebAPI的异步及返回值

目录 Action方法的异步 Action方法参数 捕捉URL占位符 捕捉QueryString的值 JSON报文体 其他方式 Action方法的异步 Action方法既可以同步也可以异步。异步Action方法的名字一般不需要以Async结尾。Web API中Action方法的返回值如果是普通数据类型&#xff0c;那么返回值…...

「 机器人 」仿生扑翼飞行器中的“被动旋转机制”概述

前言 在仿生扑翼飞行器的机翼设计中,模仿昆虫翼的被动旋转机制是一项关键技术。其核心思想在于:机翼旋转角度(攻角)并非完全通过主动伺服来控制,而是利用空气动力和惯性力的作用,自然地实现被动调节。以下对这种设计的背景、原理与优势进行详细说明。 1. 背景:昆虫的被动…...

「 机器人 」扑翼飞行器的数据驱动建模核心方法

前言 数据驱动建模可充分利用扑翼飞行器的已有运行数据,改进动力学模型与控制策略,并对未建模动态做出更精确的预测。在复杂的非线性飞行环境中,该方法能有效弥补传统解析建模的不足,具有较高的研究与应用价值。以下针对主要研究方向和实现步骤进行整理与阐述。 1. 数据驱动…...

个人网站搭建

搭建 LNMP环境搭建&#xff1a; LNMP环境指&#xff1a;Linux Nginx MySQL/MariaDB PHP&#xff0c;在debian上安装整体需要300MB的磁盘空间。MariaDB 是 MySQL 的一个分支&#xff0c;由 MySQL 的原开发者维护&#xff0c;通常在性能和优化上有所改进。由于其轻量化和与M…...

飞书项目流程入门指导手册

飞书项目流程入门指导手册 参考资料准备工作新建空间国际化配置新建工作项字段管理新建字段对接标识授权角色 流程管理基础说明流程节点配置流程节点的布局配置页面上布局按钮布局配置 流程节点驳回流程图展示自动化字段修改 局限性 参考资料 飞书官方参考文档&#xff1a;飞书…...

xss靶场

xss-labs下载地址&#xff1a;GitHub - do0dl3/xss-labs: xss 跨站漏洞平台 xss常见触发标签&#xff1a;XSS跨站脚本攻击实例与防御策略-CSDN博客 level-1 首先查看网页的源代码发现get传参的name的值test插入了html里头&#xff0c;还回显了payload的长度。 <!DOCTYPE …...

XML实体注入漏洞攻与防

JAVA中的XXE攻防 回显型 无回显型 cve-2014-3574...

switch组件的功能与用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了PageView这个Widget,本章回中将介绍Switch Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里介绍的Switch是指左右滑动的开关&#xff0c;常用来表示某项设置是打开还是关闭。Fl…...

cursor重构谷粒商城05——docker容器化技术快速入门【番外篇】

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…...

高等数学学习笔记 ☞ 微分方程

1. 微分方程的基本概念 1. 微分方程的基本概念&#xff1a; &#xff08;1&#xff09;微分方程&#xff1a;含有未知函数及其导数或微分的方程。 举例说明微分方程&#xff1a;&#xff1b;。 &#xff08;2&#xff09;微分方程的阶&#xff1a;指微分方程中未知函数的导数…...

【探索 Kali Linux】渗透测试与网络安全的终极操作系统

探索 Kali Linux&#xff1a;渗透测试与网络安全的终极操作系统 在网络安全领域&#xff0c;Kali Linux 无疑是最受欢迎的操作系统之一。无论是专业的渗透测试人员、安全研究人员&#xff0c;还是对网络安全感兴趣的初学者&#xff0c;Kali Linux 都提供了强大的工具和灵活的环…...

四方连续贴图是什么意思

上下左右四个方向都是连续的图案&#xff0c;是由一个纹样或几个纹样组成一个单位&#xff0c;向四周重复地连续和延伸扩展而成的图案形式...

ES启动失败:深入解析No buffer space available错误及连接数优化策略

1. 当ES启动失败时发生了什么 第一次看到"No buffer space available"这个报错时&#xff0c;我也是一头雾水。那天凌晨三点&#xff0c;线上监控突然报警&#xff0c;ES集群集体罢工&#xff0c;整个搜索服务直接瘫痪。查看日志发现满屏都是"java.net.SocketE…...

告别SIFT/ORB!用LoFTR+Transformer搞定低纹理场景的图片匹配(附Python实战代码)

低纹理场景图像匹配实战&#xff1a;LoFTR与Transformer的革新应用 在计算机视觉领域&#xff0c;图像特征匹配一直是三维重建、视觉定位等任务的基础环节。传统方法如SIFT、ORB依赖于特征检测器提取关键点&#xff0c;但在低纹理、重复图案或运动模糊场景中表现往往不尽如人意…...

新手友好:在快马平台用mc、jc相关案例轻松上手前端开发

作为一个刚接触前端开发的新手&#xff0c;我最近在InsCode(快马)平台尝试做了一个特别适合练手的小工具——代码行数统计器。这个项目用最基础的HTML、CSS和JavaScript实现&#xff0c;但包含了前端开发的几个核心概念&#xff0c;特别适合想通过实际案例学习的朋友。 项目功能…...

OpCore-Simplify:零基础黑苹果配置终极指南,5分钟搞定复杂EFI

OpCore-Simplify&#xff1a;零基础黑苹果配置终极指南&#xff0c;5分钟搞定复杂EFI 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果配置…...

不止于搭建:用DVWA靶场在Kali上复现SQL注入与文件上传漏洞实战

不止于搭建&#xff1a;用DVWA靶场在Kali上复现SQL注入与文件上传漏洞实战 当你第一次在Kali Linux上成功运行DVWA靶场时&#xff0c;那种成就感就像解锁了新世界的大门。但真正的乐趣才刚刚开始——这个看似简单的靶场&#xff0c;其实是网络安全爱好者最好的实战训练场。本文…...

Wan2.2-I2V-A14B部署教程:系统盘50GB+数据盘40GB最小化配置实操

Wan2.2-I2V-A14B部署教程&#xff1a;系统盘50GB数据盘40GB最小化配置实操 1. 镜像概述与核心特性 Wan2.2-I2V-A14B是一款专为文生视频任务优化的私有部署镜像&#xff0c;特别针对RTX 4090D 24GB显存显卡进行了深度优化。这个镜像最大的特点是开箱即用&#xff0c;内置了完整…...

ScanTailor Advanced:3步让你的扫描文档焕然一新

ScanTailor Advanced&#xff1a;3步让你的扫描文档焕然一新 【免费下载链接】scantailor-advanced ScanTailor Advanced is the version that merges the features of the ScanTailor Featured and ScanTailor Enhanced versions, brings new ones and fixes. 项目地址: htt…...

AI结对编程:借助快马平台智能生成qclaw官网的AI功能模块

最近在开发qclaw官网时&#xff0c;尝试用AI辅助完成了一个合同条款分析功能&#xff0c;整个过程比想象中顺畅很多。这个功能的核心是让用户输入合同文本后&#xff0c;自动评估风险等级并给出提示。下面分享下具体实现思路和与AI协作的实践经验。 功能设计要点 首先明确这个…...

《数据结构》| 第十章 排序算法实战指南

1. 排序算法入门&#xff1a;为什么我们需要这么多排序方法&#xff1f; 第一次接触排序算法时&#xff0c;很多人都会有这样的疑问&#xff1a;既然都能把数据排好序&#xff0c;为什么还要学这么多种算法&#xff1f;这就像装修时既有电钻又有锤子——每种工具都有最适合的使…...

如何为Obsidian插件添加多语言支持:终极国际化指南

如何为Obsidian插件添加多语言支持&#xff1a;终极国际化指南 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n 如果你正在寻找一款能够帮助你的Obsidian插件突破语言限制的工具&#xff0c;那么Obsidian-i18n正是你需要的…...