FigJam自定义Widget:属性菜单触发figma.showUI弹窗异常求助
解决FigJam自定义Widget弹窗一闪即逝的问题
问题核心是属性菜单的事件处理器默认同步执行,函数跑完后Widget进程直接终止,但figma.showUI是异步初始化操作,还没完成就被中断,导致弹窗一闪而逝。按报错提示,让事件处理器返回Promise就能解决。
具体修改方案
方法1:用async/await简化实现
把事件处理函数改成async函数,用await等待figma.showUI完成初始化:
figma.on('run', async ({ command }) => { if (command === 'Open Settings') { // 等待UI弹窗加载完成 await figma.showUI(__html__, { width: 300, height: 250 }); // 如需和UI交互,比如接收消息,可在这里添加逻辑 figma.ui.onmessage = (msg) => { if (msg.type === 'close-settings') { figma.ui.close(); } }; } });
方法2:手动返回Promise
如果不想用async/await,也可以直接返回Promise,让Figma等待异步操作结束:
figma.on('run', ({ command }) => { if (command === 'Open Settings') { return new Promise((resolve) => { figma.showUI(__html__, { width: 300, height: 250 }); // 监听UI关闭事件,用户关闭弹窗后再结束Widget进程 figma.ui.on('close', () => { resolve(); }); }); } });
原理说明
Figma的Widget命令处理器默认是同步模式,函数执行完毕后立刻终止Widget后台进程。而figma.showUI需要时间加载iframe内容,返回Promise(或用async/await)会告诉Figma:"等这个异步操作完成再终止进程",确保UI弹窗能正常显示并和用户交互。
内容的提问来源于stack exchange,提问作者Laurin Stahl
相关产品推荐
相关产品推荐

