IT评测·应用市场-qidao123.com

标题: Flutter 利用 flutter_inappwebview 加载 App 本地 HTML 文件 [打印本页]

作者: 农妇山泉一亩田    时间: 2025-1-24 04:56
标题: Flutter 利用 flutter_inappwebview 加载 App 本地 HTML 文件
在 Flutter 开辟中,加载本地 HTML 文件是一个常见的需求,尤其是在需要展示离线内容或自定义页面时。flutter_inappwebview 是一个功能强大的插件,支持加载本地文件和网络资源。本文将详细介绍如何利用 flutter_inappwebview 加载 App 本地 HTML 文件,包括传统加载资源文件的方法和从 App 目录加载文件的方法。
一、传统加载资源文件
  1. flutter:
  2.   assets:
  3.     - membership_agreement.html
复制代码
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/services.dart' show rootBundle;
  3. import 'package:flutter_inappwebview/flutter_inappwebview.dart';
  4. class LocalHtmlPage extends StatefulWidget {
  5.   final String html;
  6.   LocalHtmlPage({required this.html});
  7.   @override
  8.   _LocalHtmlPageState createState() => _LocalHtmlPageState();
  9. }
  10. class _LocalHtmlPageState extends State<LocalHtmlPage> {
  11.   late InAppWebViewController _webViewController;
  12.   Future<String> _getFile() async {
  13.     return await rootBundle.loadString(widget.html);
  14.   }
  15.   @override
  16.   Widget build(BuildContext context) {
  17.     return Scaffold(
  18.       appBar: AppBar(title: Text("加载本地 HTML 文件")),
  19.       body: FutureBuilder<String>(
  20.         future: _getFile(),
  21.         builder: (context, snapshot) {
  22.           if (snapshot.hasData) {
  23.             final String htmlUrl = Uri.dataFromString(
  24.               snapshot.data!,
  25.               mimeType: 'text/html',
  26.               encoding: Encoding.getByName('utf-8'),
  27.               base64: true,
  28.             ).toString();
  29.             return InAppWebView(
  30.               initialUrlRequest: URLRequest(url: Uri.parse(htmlUrl)),
  31.               onWebViewCreated: (controller) {
  32.                 _webViewController = controller;
  33.               },
  34.               onLoadStart: (controller, url) {
  35.                 print('开始加载: $url');
  36.               },
  37.               onLoadStop: (controller, url) {
  38.                 print('加载完毕: $url');
  39.               },
  40.               onConsoleMessage: (controller, consoleMessage) {
  41.                 print('Console message: ${consoleMessage.message}');
  42.               },
  43.             );
  44.           }
  45.           return Center(child: Text('读取失败'));
  46.         },
  47.       ),
  48.     );
  49.   }
  50. }
复制代码
二、加载 App 目录文件
  1. import 'dart:io';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_inappwebview/flutter_inappwebview.dart';
  5. import 'package:path_provider/path_provider.dart';
  6. class LocalHtmlPage extends StatefulWidget {
  7.   final String htmlFileName;
  8.   LocalHtmlPage({required this.htmlFileName});
  9.   @override
  10.   _LocalHtmlPageState createState() => _LocalHtmlPageState();
  11. }
  12. class _LocalHtmlPageState extends State<LocalHtmlPage> {
  13.   late InAppWebViewController _webViewController;
  14.   Future<File?> getLocalHtmlFile() async {
  15.     final directory = await getApplicationDocumentsDirectory();
  16.     final filePath = "${directory.path}/${widget.htmlFileName}";
  17.     final file = File(filePath);
  18.     if (await file.exists()) {
  19.       return file;
  20.     }
  21.     return null;
  22.   }
  23.   Future<void> load() async {
  24.     try {
  25.       final file = await getLocalHtmlFile();
  26.       if (file != null) {
  27.         print('加载本地 HTML 文件: file://${file.path}');
  28.         _webViewController.loadUrl(
  29.           urlRequest: URLRequest(url: Uri.file(file.path)),
  30.         );
  31.       } else {
  32.         print('文件不存在');
  33.       }
  34.     } catch (e, stackTrace) {
  35.       print('加载本地 HTML 文件异常: $e');
  36.       print(stackTrace);
  37.     }
  38.   }
  39.   @override
  40.   Widget build(BuildContext context) {
  41.     return Scaffold(
  42.       appBar: AppBar(title: Text("加载本地 HTML 文件")),
  43.       body: InAppWebView(
  44.         onWebViewCreated: (controller) {
  45.           _webViewController = controller;
  46.           load();
  47.         },
  48.         onLoadStart: (controller, url) {
  49.           print('开始加载: $url');
  50.         },
  51.         onLoadStop: (controller, url) {
  52.           print('加载完毕: $url');
  53.         },
  54.         onProgressChanged: (controller, progress) {
  55.           print('WebView 加载中 (进度: $progress%)');
  56.         },
  57.         onConsoleMessage: (controller, consoleMessage) {
  58.           print('Console message: ${consoleMessage.message}');
  59.         },
  60.         gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{
  61.           Factory(() => EagerGestureRecognizer()),
  62.         }.toSet(),
  63.       ),
  64.     );
  65.   }
  66. }
复制代码
三、留意事项
文件路径问题:
确保文件路径精确,并且文件确实存在于指定路径下。
假如文件路径是动态天生的,确保路径格式精确。
文件内容问题:
确保 HTML 文件内容是有效的,且没有语法错误。
可以在浏览器中直接打开该 HTML 文件,确认其是否正常表现。
iOS 网络权限:
假如加载的文件路径是 file://,确保 iOS 的网络权限配置精确。在 Info.plist 中添加以下配置:
  1. <key>NSAppTransportSecurity</key>
  2. <dict>
  3.     <key>NSAllowsArbitraryLoads</key>
  4.     <true/>
  5. </dict>
复制代码
日志输出:
假如需要关闭日志输出,可以在 Dart 代码中过滤日志消息,或在 iOS 和 Android 项目中配置日志级别。
通过以上方法,你可以灵活地利用 flutter_inappwebview 加载本地 HTML 文件,无论是通过资源文件还是从 App 目录加载。渴望本文能帮助你更好地实现这一功能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4