Forge Viewer 7.88版本出现glrenderer读取null属性错误求助
Forge Viewer 7.88+ 修复
TypeError: Cannot read properties of null (reading 'glrenderer') 问题 问题描述
升级到Forge Viewer 7.88版本后,出现以下报错:
TypeError: Cannot read properties of null (reading 'glrenderer')TypeError: Cannot read property 'glrenderer' of null
错误触发于MediaQueryList.onPixelRatioChanged,完整堆栈信息:
TypeError: Cannot read properties of null (reading 'glrenderer') at MediaQueryList.onPixelRatioChanged (https://developer.api.autodesk.com/modelderivative/v2/viewers/7.88.0/viewer3D.min.js:18:363918) at R.invokeTask (https://<sub-domain>.<domain>.ch/polyfills.b7a09e8149b912e2.js:1:37636) at Object.onInvokeTask (https://<sub-domain>.<domain>.ch/main.44847181a35edb80.js:1:1896856) at R.invokeTask (https://<sub-domain>.<domain>.ch/polyfills.b7a09e8149b912e2.js:1:37557) at fe.runTask (https://<sub-domain>.<domain>.ch/polyfills.b7a09e8149b912e2.js:1:32977) at _.invokeTask [as invoke] (https://<sub-domain>.<domain>.ch/polyfills.b7a09e8149b912e2.js:1:38695) at M (https://<sub-domain>.<domain>.ch/polyfills.b7a09e8149b912e2.js:1:51451) at G (https://<sub-domain>.<domain>.ch/polyfills.b7a09e8149b912e2.js:1:51759) at MediaQueryList.he (https://<sub-domain>.<domain>.ch/polyfills.b7a09e8149b912e2.js:1:52042)
问题原因
该错误是因为Viewer的像素比例监听回调在glrenderer实例已销毁后仍被触发,大概率是7.88版本的Viewer在资源回收逻辑上存在疏漏,导致MediaQuery的事件监听器未被正确清理。
修复方案
1. 手动完善Viewer销毁流程
在销毁Viewer时,执行完整的清理步骤,包括移除自定义事件监听、调用官方销毁方法,额外清理MediaQuery相关监听:
// 假设viewer是你的Viewer实例对象 if (viewer) { // 移除所有你添加的自定义事件监听 viewer.removeEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, yourGeometryLoadedHandler); viewer.removeEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, yourSelectionChangedHandler); // 这里继续移除其他你绑定的事件 // 调用Viewer官方销毁方法 viewer.finish(); viewer = null; // 临时修复:手动清理像素比例变化的监听 const mql = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`); if (mql && mql.onPixelRatioChanged) { mql.removeEventListener('change', mql.onPixelRatioChanged); } }
2. 升级到Viewer最新稳定版本
Autodesk后续版本大概率会修复这个资源泄漏问题,直接升级到7.88之后的版本(比如7.90及以上),可以先查看官方更新日志确认修复情况。
3. 优化单页应用的Viewer生命周期管理
如果是单页应用场景,在页面切换、组件卸载前提前销毁Viewer,避免在Viewer实例已回收后触发浏览器像素比例变化(比如窗口缩放、显示器分辨率调整)。
内容的提问来源于stack exchange,提问作者heaxyh
相关产品推荐
相关产品推荐

