Ubuntu 18.10下Electron dialog.showOpenDialog()调用致应用崩溃求助
针对Ubuntu 18.10上Electron dialog.showOpenDialog()崩溃的解决方案
我之前在Ubuntu 18.10上也碰到过完全一样的问题!折腾了好一阵才找到几个有效的调整方向,分享给你:
降级Electron版本适配系统
Ubuntu 18.10属于比较老旧的发行版,高版本Electron(比如12+)对它的GTK3环境兼容性不太好。我当时把Electron从12.x降级到9.4.4后,对话框崩溃的问题直接解决了。可以用这个命令安装指定版本:npm install electron@9.4.4 --save-dev明确指定对话框的父窗口
在Linux系统下,Electron的原生对话框需要明确绑定到主窗口实例,否则容易因为上下文缺失导致进程崩溃。修改你的代码,把主窗口作为第一个参数传给showOpenDialog:
主进程直接调用的版本:dialog.showOpenDialog(mainWindow, { title: "Select a file", filters: [{ name: "All Files", extensions: ["*"] }] }, fileNames => { if (fileNames === undefined) { console.log("No file selected"); } // 后续处理逻辑 })IPC回调里的版本(通过event获取窗口实例):
ipcMain.on('openFile', (event, path) => { const parentWindow = event.sender.getOwnerBrowserWindow(); dialog.showOpenDialog(parentWindow, function (fileNames) { if (fileNames === undefined) { console.log("No file selected"); } else { console.log("fileNames", fileNames); } }); })安装缺失的系统依赖库
Ubuntu 18.10默认可能缺少Electron运行原生对话框需要的GTK及相关依赖包,执行下面的命令补全:sudo apt-get install libgtk-3-0 libx11-xcb1 libxcb-dri3-0 libdrm2 libgbm1 libnss3 libxss1这些是Electron与系统UI交互的基础依赖,缺失时很容易触发崩溃。
改用Promise风格的API
旧的回调风格在部分Linux环境下存在兼容性隐患,换成Promise版本的调用试试:async function openFilePicker() { const result = await dialog.showOpenDialog(mainWindow, { title: "Select a file", filters: [{ name: "All Files", extensions: ["*"] }] }); if (!result.canceled) { console.log("Selected files:", result.filePaths); } else { console.log("No file selected"); } } // 调用函数 openFilePicker();
建议你按顺序尝试这些方法,我当时是先降级Electron再加父窗口参数就解决了问题。
内容的提问来源于stack exchange,提问作者Vaclav
相关产品推荐
相关产品推荐

