uni-app 关闭webview之后,plus截屏方法报错
uni-app 关闭webview之后,plus截屏方法报错
信息 | 内容 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC开发环境版本 | macOS |
HBuilderX类型 | Alpha |
HBuilderX版本 | 3.98 |
手机系统 | 全部 |
手机厂商 | 华为 |
页面类型 | vue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
测试过的手机:
- 苹果
- 小米
示例代码:
/**
* 关闭webview
* @param {Object} data - 请求参数
* @param {Number} index - webview index
* @param {Object} wv - webview对象
*/
biz_navigation_close(data, index, wv) {
let result = JSON.stringify({
success: true,
message: 'ok',
type: 'biz_navigation_close',
})
try {
// const current = this.webViewList[index]
this.webViewList = this.webViewList.filter((k, i) => i !== index)
const ws = plus.webview.currentWebview()
// 这里关闭后
plus.webview.close(ws)
console.log(plus.webview.all())
} catch (e) {
result = JSON.stringify({
success: false,
message: e,
type: 'biz_navigation_close',
})
}
wv && wv.evalJS(`window.biz_navigation_closeCallback(${result})`)
},
// 截屏绘制方法
let pages = getCurrentPages()
let page = pages[pages.length - 1]
let ws = page.$getAppWebview()
let bitmap = new plus.nativeObj.Bitmap('drawScreen')
// 这个方法报异常 状态码为-99
ws.draw(bitmap, () => {})
操作步骤:
- 打开一个web view,然后关闭,调用代码节选中的ws.draw() 方法报错,状态码是-99
预期结果:
- 能够正常运行
实际结果:
bug描述:
- 如题。
2 回复
let ws = plus.webview.currentWebview()
let bitmap = new plus.nativeObj.Bitmap(‘drawScreen’)
ws.draw(
bitmap,
() => {})
则是白屏
在使用 uni-app
开发时,如果你在关闭 Webview
后调用 plus.screen
的截屏方法(如 plus.screen.capture
),可能会遇到报错。这通常是因为 Webview
被关闭后,相关的 Webview
对象已经被销毁,导致 plus.screen
方法无法正常执行。
解决方案
-
确保 Webview 存在: 在调用
plus.screen.capture
之前,确保Webview
仍然存在并且没有被关闭。你可以在调用截屏方法之前检查Webview
的状态。let webview = plus.webview.currentWebview(); if (webview && !webview.isClosed()) { plus.screen.capture(function(success) { console.log('截屏成功', success); }, function(error) { console.log('截屏失败', error); }); } else { console.log('Webview 已关闭,无法截屏'); }
-
延迟执行截屏: 如果你在关闭
Webview
后立即调用截屏方法,可能会导致报错。你可以尝试延迟执行截屏操作,确保Webview
已经完全关闭。setTimeout(function() { plus.screen.capture(function(success) { console.log('截屏成功', success); }, function(error) { console.log('截屏失败', error); }); }, 1000); // 延迟1秒执行
-
监听 Webview 关闭事件: 如果你需要在
Webview
关闭后执行某些操作,可以监听Webview
的关闭事件,并在事件回调中执行截屏操作。let webview = plus.webview.currentWebview(); webview.addEventListener('close', function() { plus.screen.capture(function(success) { console.log('截屏成功', success); }, function(error) { console.log('截屏失败', error); }); });
-
使用全局变量存储 Webview 状态: 你可以在关闭
Webview
时设置一个全局变量来标记Webview
的状态,然后在调用截屏方法时检查这个变量。let isWebviewClosed = false; function closeWebview() { let webview = plus.webview.currentWebview(); webview.close(); isWebviewClosed = true; } function captureScreen() { if (!isWebviewClosed) { plus.screen.capture(function(success) { console.log('截屏成功', success); }, function(error) { console.log('截屏失败', error); }); } else { console.log('Webview 已关闭,无法截屏'); } }