flutter web 加载html内容,请看这里https://juejin.im/post/6844904094725849095,本文不再详述加载html的方法,主要讲述在加载html过程中遇到的问题和解决方案。
问题1:dart:ui 无法找到platformViewRegistry方法
ui.platformViewRegistry.registerViewFactory
异常提示:
The name 'platformViewRegistry' is being referenced through the prefix 'ui', but it isn't defined in any of the libraries imported using that prefix.
分析:该问题是因为flutter sdk 1.19在迁移 flutter_web_ui 到dart:ui过程中,没有把该方法允许外部调用,导致了该问题。
解决方案:
首先确认当前flutter channel 为beta、develop、master 其中之一
方案一
自己定义platformViewRegistry.registerViewFactory方法,动态引入该方法。
class platformViewRegistry {
static registerViewFactory(String viewId, dynamic cb) {}
}
import 'ui_fake.dart' if (dart.library.html)'dart:ui' as ui;
方案二
在yaml文件中设置,忽略该错误(不推荐使用)
analyzer:
errors:
undefined_prefixed_name: ignore
问题2:首次打开加载html页面正常展示内容,第二次开始进入页面,展示异常提示
错误示例:
import'dart:ui'as ui;
ui.platformViewRegistry.registerViewFactory('hello-world-html', (int viewId) => HtmlElement();
HtmlElementView( viewType: 'hello-world-html',)
异常提示:
TypeError: Cannot read property 'd8' of null
分析:这个问题是因为registerViewFactory不能重复注册视图,而视图的区分,是根据viewType作为标识来区分视图类型,所以一直使用"hello-world-html”作为标识,第二进入页面时,就会出现重复注册问题。
解决方案:
viewType =DateTime.now().toIso8601String();
问题3:setState()无法重新加载html内容
解决方案:
在build方法中调用ui.platformViewRegistry.registerViewFactory