flutter - Flutter,WebView - 使用自定义 HTML 重建
问题描述
我想在我的 Flutter 应用程序的WebView中显示一些生成的 HTML。包含 WebView 的 StatefulWidget 可以更改 WebView 必须重建的某些属性。
TL;DR:如何在没有 initialUrl
的情况下提供自定义 HTML ?
到目前为止,我使用initialUrl
WebView 构造函数的属性来提供一个直接嵌入我的 HTML 的 URI:
WebView(
initialUrl: Uri.dataFromString(myHtml, mimeType: 'text/html').toString(),
)
现在我意识到,当某些状态被设置时,我必须用不同的值重建 WebView。(即 WebView 上方的下拉菜单)。顾名思义,这个 URI 只是初始的。
所以我的问题是:如何更新 WebView 中的 HTML?是否有某种方法可以重置 WebView 的内部状态?
解决方案
我猜 webview 的 api 不允许这样做,但您可以使用一种解决方法:只需将 HTML 保存到临时文件并提供 URI 以WebView
使用initialUrl
. 这是示例:
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:webview_flutter/webview_flutter.dart';
class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
Uri uri;
Future<void> _showHtml(String html) async {
final tempDir = await getTemporaryDirectory();
final path = join(tempDir.path, 'page.html');
final tempFile = File(path);
tempFile.writeAsStringSync(html);
setState(() {
uri = Uri(scheme: 'file', path: path);
});
}
@override
void initState() {
super.initState();
_showHtml('<html>Test</html>');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: SafeArea(
child: uri != null ? WebView(
initialUrl: uri.toString(),
) : Container()
),
);
}
}
您还可以使用onWebViewCreated
回调来保存 webview 的控制器,并在以后使用控制器加载其他使用loadUrl
方法。
推荐阅读
- javascript - 如何在反应中将组件传递给onClick
- elasticsearch - 其中一个 pod 副本未能通过 liveness 探测并重新启动
- python - 如果我自己实现客户端代码和接口,对客户端代码的防御性编程?
- python-3.x - Flask 应用程序和 azure 函数
- javascript - Office js(Word):是否可以获取搜索词的坐标(X;Y)?
- javascript - getInstalledRelatedApps() API 未检测到已安装的应用程序
- javascript - 在本地存储中保存一个 css 显示值
- django - urlspattern 中的几个 id
- ios - 使用正交滚动行为时,isScrollEnabled 在集合视图中不起作用
- r - 是否有可能从 R 中的一长列两小?