Electron开发:Arch系统下showOpenDialog报错的解决方法
问题
在Arch Linux上开发Electron应用,使用showOpenDialog()实现文件上传时,文件选择器能正常打开,但终端会抛出两个GLib-GObject相关错误:
[4801:0205/172224.193666:ERROR:browser_main_loop.cc(276)] GLib-GObject: invalid cast from 'GtkFileChooserNative' to 'GtkWidget'
[4801:0205/172226.571068:ERROR:browser_main_loop.cc(276)] GLib-GObject: ../glib/gobject/gsignal.c:2777: instance '0x12b000ac7bf0' has no handler with id '3139'
相关代码(main.js):
ipcMain.handle('gallery-add-files', (e) => { var files = dialog.showOpenDialog(BrowserWindow.getFocusedWindow(), { properties:[ 'openFile', 'multiSelections' ] }, function(files){ console.log(files) }); })
已提前安装xdg-desktop-portal和xdg-desktop-portal-gtk解决过其他同类问题。
解决办法
将异步的showOpenDialog()替换为同步方法showOpenDialogSync(),修改后的代码示例:
ipcMain.handle('gallery-add-files', (e) => { const result = dialog.showOpenDialogSync(BrowserWindow.getFocusedWindow(), { properties: ['openFile', 'multiSelections'] }); console.log(result); return result; })
替换后终端无报错,功能正常。
原因
showOpenDialog()作为异步方法,返回的是包含canceled和filePaths属性的对象,原代码中直接将其赋值给单个变量files的写法存在问题。虽然通过回调能处理文件选择结果,但这种写法会触发底层的GLib-GObject类型转换错误。
尝试修正异步方法的变量接收逻辑(正确解构返回对象)时,功能可正常运行,但终端仍会抛出上述错误。改用同步方法后,直接获取结果对象,彻底避免了异步回调带来的底层错误。
内容的提问来源于stack exchange,提问作者P4lmeiras

