园子的 vscode 插件一直存在一个奇怪的视图加载问题,虽然已经是登录状态,但每次启动 vscode 之后进入插件,总是先出现登录界面
然后再出现已登录的界面
package.json 中对应的视图配置
插件的实现代码开源在 github 上 https://github.com/cnblogs/vscode-cnb
extension activate 部分的实现见 extension.ts
请问如何解决这个问题?
vscode-cnb.isAuthed 的值是通过下面的代码设置的
await commands.executeCommand('setContext', `${globalCtx.extName}.isAuthed`, isAuthed)
问题原因
虽然在 extension.ts 中通过 setContext
设置了 vscode-cnb.isAuthed
的值,但是在 extension 启动过程中的某一段时间,setContext
还没生效,会使用默认值 false
,从而满足 "when": "!vscode-cnb.isAuthed"
造成 cnblogs-authorize view (登录界面)显示出来。
解决办法
反其道行之,相对于 isAuthed
引入 isUnauthorized
await execCmd('setContext', `${globalCtx.extName}.isUnauthorized`, !isAuthed)
从而促成默认值时 when
条件不满足,以实现登录界面不显示
{
"id": "cnblogs-authorize",
"name": "登录/授权",
"when": "vscode-cnb.isUnauthorized",
"visibility": "visible"
}
带来的新问题
采用上面的解决问题后,发现一个新问题,在 extenion 启动过程中 setContext
生效之前,由于没有任何 view 的 when
满足条件,vscode 就不会在侧边栏显示这个 extension 的图标,直到至少一个 view 的 when
满足条件才会显示,从而造成 extension 图标的延迟显示,影响用户体验。
于是采用一个变通方法,正好有一个 view 可以在未登录/已登录情况下都可以显示,就用它作为启动过程中 setContext
生效之前的默认 view
{
"id": "vscode-cnb-workspace",
"name": "工作空间",
"when": "!vscode-cnb.isUnauthorized",
"visibility": "collapsed"
}
更好的解决方法是做一个专门的启动界面。
应该还有更更好的解决,Figma 插件没有这个问题。
可能是 treeview 已经注册了, 但是 vscode-cnb.isAuthed 后面才更新, 导致前面会先显示 when=!vscode-cnb.isAuthed 的 view