如何使用flutter dart webview呈现本地HTML文件

问题描述 投票:3回答:3

我想使用flutter和dart在webview中呈现存储在手机内存中的本地HTML文件。

webview dart flutter flutter-layout
3个回答
6
投票

这是一个更详细的答案。我正在使用Flutter团队的webview_flutter插件。

Steps

  1. 将依赖项添加到pubspec.yaml: dependencies: webview_flutter: ^0.3.4
  2. 将一个html文件放在assets文件夹中(参见this)。我称之为help.html
  3. 在代码中获取html字符串并将其添加到webview。 import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:webview_flutter/webview_flutter.dart'; class HelpScreen extends StatefulWidget { @override HelpScreenState createState() { return HelpScreenState(); } } class HelpScreenState extends State<HelpScreen> { WebViewController _controller; @override Widget build(BuildContext context) { _loadHtmlFromAssets(); return Scaffold( appBar: AppBar(title: Text('Help')), body: WebView( initialUrl: '', onWebViewCreated: (WebViewController webViewController) { _controller = webViewController; }, ), ); } _loadHtmlFromAssets() async { String fileText = await rootBundle.loadString('assets/help.html'); _controller.loadUrl( Uri.dataFromString( fileText, mimeType: 'text/html', encoding: Encoding.getByName('utf-8') ).toString()); } }

Notes:

  • 因为我们异步加载html文件,所以我将initialUrl设置为空字符串(null导致异常)。我不知道这是否是标准做法,但似乎有效。
  • 我需要将编码设置为UTF-8,因为我遇到了非ASCII字符的崩溃。我相信UTF-8无论如何都是网络的标准。
  • 在iOS中,您需要在Info.plist文件中将密钥io.flutter.embedded_views_preview添加为true。检查docs有关此要求的任何更新。

See also


2
投票

您可以传递数据URI

Uri.dataFromString('<html><body>hello world</body></html>', mimeType: 'text/html').toString()

或者您可以在Flutter中启动Web服务器并传递指向服务器为其提供文件的IP /端口的URL。

另见https://github.com/fluttercommunity/flutter_webview_plugin/issues/23中的讨论

请参阅https://flutter.io/docs/development/ui/assets-and-images#loading-text-assets,了解如何从资产中加载字符串。

有关如何阅读其他文件,请参阅https://flutter.io/docs/cookbook/persistence/reading-writing-files


0
投票

@Suragch,你的代码不像你发布的那样工作,它说localUrl是在null上调用的。分配控制器后需要调用_loadHtmlFromAssets:

onWebViewCreated: (WebViewController webViewController) {
          _controller = webViewController;
          _loadHtmlFromAssets();
        }

然后它工作正常:)

© www.soinside.com 2019 - 2024. All rights reserved.