electron 电子19 showOpenDialog“无法读取未定义的属性(阅读”showOpenDialog“)”

j9per5c4  于 2022-12-16  发布在  Electron
关注(0)|答案(1)|浏览(439)

我已将电子版更新为版本19,但出现错误:
无法读取未定义的属性(阅读“showOpenDialog”)
我有一个保存文件的功能:

window.SaveFile = function (options, callBack) {
    const {
        name, //the name showed for the extension/s
        extensions,
        fileName
    } = options;
    let filters = [{ name: name, extensions: Array.isArray(extensions) ? extensions : [extensions] }];
    dialog.showSaveDialog(null, { properties: ['saveFile'], name: [name], filters: filters, icon: 'main.ico', defaultPath: (fileName || name) + '.' + extensions }, (returnValue) => {
        callBack(returnValue);
    });
}

但是dialog是未定义的。在index.js中我设置了:

webPreferences: {
    enableRemoteModule: true,
    nodeIntegration: true
}

我需要的电子是

const { ipcRenderer, dialog, remote, ipcMain } = require('electron');

但是dialogremote未定义。
我该如何解决这个问题?

jrcvhitl

jrcvhitl1#

不久前,remote模块被弃用(请参阅Electron的突破性更改文档)。因为dialog是主进程模块,所以现在必须从主进程打开对话框。
当然,这会使事情变得有点复杂,但是对于ipcRendereripcMain,这应该很容易实现。
假设渲染器进程中有const { ipcRenderer } = require("electron");

window.SaveFile = function (options, callBack) {
    ipcRenderer.invoke ("save-file", options).then (returnValue => {
        callBack (returnValue);
    });
}

然后在主流程中:

ipcMain.handle ("save-file", async (event, options) => {
    const {
        name, //the name showed for the extension/s
        extensions,
        fileName
    } = options;
    let filters = [{ name: name, extensions: Array.isArray(extensions) ? extensions : [extensions] }];
    var returnValue = await dialog.showSaveDialog(
        null,
        {
            properties: ['saveFile'],
            name: [name],
            filters: filters,
            icon: 'main.ico',
            defaultPath: (fileName || name) + '.' + extensions
        }
    );

    return returnValue;
});

相关问题