Flutter 3.3.0升级后registerViewFactory断言失败问题求助
Flutter Web升级3.3.0后WebView注册视图工厂断言失败的解决方案
问题情况
升级Flutter到3.3.0版本前,WebView相关代码可正常运行,升级后触发断言失败错误,错误信息如下:
Assertion failed: org-dartlang-sdk:///flutter_web_sdk/lib/_engine/engine/platform_views/content_manager.dart:67:12
factoryFunction is PlatformViewFactory ||
factoryFunction is ParameterizedPlatformViewFactory
is not true
涉及代码:
ui.platformViewRegistry.registerViewFactory( 'someKey', (int _) => getIframe() ..id = 'SomeIframeId' ..src = url ?? "data:text/html;base64,${Constant.contentBase64}" ..style.border = 'none' as html.IFrameElement, );
问题原因
Flutter 3.3.0对registerViewFactory的工厂函数类型检查进行了严格限制,要求工厂函数必须是PlatformViewFactory或ParameterizedPlatformViewFactory类型。原代码中as html.IFrameElement的位置错误,导致函数返回值的类型推断出现问题,不符合类型要求。
解决方案
调整类型转换的位置,确保工厂函数明确返回html.IFrameElement类型,修改后的代码如下:
ui.platformViewRegistry.registerViewFactory( 'someKey', (int _) => (getIframe() ..id = 'SomeIframeId' ..src = url ?? "data:text/html;base64,${Constant.contentBase64}" ..style.border = 'none') as html.IFrameElement, );
或者更明确地拆分逻辑,避免类型推断错误:
ui.platformViewRegistry.registerViewFactory( 'someKey', (int viewId) { final iframe = getIframe() ..id = 'SomeIframeId' ..src = url ?? "data:text/html;base64,${Constant.contentBase64}" ..style.border = 'none'; return iframe as html.IFrameElement; }, );
核心是确保工厂函数的返回值被正确识别为html.Element的子类,符合PlatformViewFactory的类型要求。
内容的提问来源于stack exchange,提问作者Mustafa TÜRKMEN
相关产品推荐
相关产品推荐

