You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron开发:Arch系统下showOpenDialog报错的解决方法

Electron showOpenDialog() 在Arch Linux下触发GLib-GObject错误的解决办法

问题

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:55:21