??最近碰到一个需求,需要在Flutter Web项目中加载html。在手机端我们可以使用
HtmlElementView的基本使用规则
??使用这个控件必须要注意,使用之前需要注册!!!
??可以在
1 2 3 4 | import 'dart:ui' as ui; ui.platformViewRegistry.registerViewFactory( 'hello-world-html', (int viewId) => HtmlElement(); |
??
??使用
1 2 3 | HtmlElementView( viewType: 'hello-world-html', ) |
加载URL
??加载URL可以使用
1 2 3 4 5 | ui.platformViewRegistry.registerViewFactory( 'hello-world-html', (int viewId) => IFrameElement() ..style.border = 'none' ..src = 'https://www.baidu.com'); |
加载本地html文件
1 2 3 4 5 | ui.platformViewRegistry.registerViewFactory( 'hello-world-html', (int viewId) => IFrameElement() ..style.border = 'none' ..src = '/assets/test2.html'); |
加载html string
- 加载比较复杂的混合型html
??如果是各种标签混合的html,建议使用
1 2 3 4 5 | ui.platformViewRegistry.registerViewFactory( 'hello-world-html', (int viewId) => HtmlHtmlElement() ..style.border = 'none' ..setInnerHtml(html)); |
??这里要注意有坑,因为实际项目中使用到的html,含有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | final NodeValidator _validator = NodeValidatorBuilder.common() ..allowElement('img', attributes: ['src'], uriPolicy: _AllowUriPolicy()) ..allowElement('a', attributes: ['href'], uriPolicy: _AllowUriPolicy()); ui.platformViewRegistry.registerViewFactory( 'hello-world-html', (int viewId) => HtmlHtmlElement() ..style.border = 'none' ..setInnerHtml(html,validator: _validator)); class _AllowUriPolicy implements UriPolicy { @override bool allowsUri(String uri) { return true; } } |
- 加载单个标签的html
??建议使用轻量型的