es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo usar showOpenDialog con IPC de Electron?

Estoy aprendiendo a vivir sin remote en mi aplicación electron. He llegado al punto en el que necesito abrir un archivo desde el proceso de representación, lo cual entiendo que requiere que el proceso principal muestre el diálogo de archivos y envíe los resultados de vuelta.

En mi archivo main.js, tengo lo siguiente:

js
ipcMain.on('open-file',(event,data)=>{
dialog.showOpenDialog(null, data, (filePaths) => {
event.sender.send('open-file-paths', filePaths);
});
});

En mi proceso de representación, que llamo pager.js, tengo lo siguiente:

js
ipcRenderer.send('open-file',{
title: 'Título',
defaultPath: localStorage.getItem('defaultPath')
});
ipcRenderer.on('open-file-paths',(event,data)=>{
console.log(event);
console.log(data);
});

El diálogo de apertura de archivo funciona bastante bien, pero no sé cómo obtener los resultados. El ipcRenderer.on('open-file-paths',...)no se llama, así que obviamente no es la forma correcta de hacerlo. Me gustaría obtener la ruta (o rutas) seleccionada(s) o un mensaje de cancelación.

¿Cómo obtengo los resultados de showOpenDialog en el proceso de representación?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener los resultados de showOpenDialog en el proceso de renderizado, debes usar el módulo remote, que mencionaste que estabas tratando de evitar. Sin embargo, hay una solución alternativa para esto.

    En tu proceso principal, en lugar de usar dialog.showOpenDialog, puedes usar dialog.showOpenDialogSync, que es una versión sincrónica de la función. Esto significa que la llamada a la función no se completará hasta que el usuario haya seleccionado un archivo o cancelado el diálogo, y la función devolverá la(s) ruta(s) del archivo seleccionado o undefined si se canceló el diálogo.

    Puedes modificar tu código de ipcMain de la siguiente manera:

    ipcMain.on('open-file',(event,title,defaultPath)=>{
        const filePaths = dialog.showOpenDialogSync(null, {
          title: title,
          defaultPath: defaultPath
        });
        event.sender.send('open-file-paths',filePaths);
    });
    

    En tu proceso de renderizado, luego puedes modificar tu código para usar ipcRenderer.invoke, que es una nueva característica en Electron 12 que te permite llamar a una función en el proceso principal y recibir un valor de retorno en el proceso de renderizado.

    ipcRenderer.invoke('open-file', 'Título', localStorage.getItem('defaultPath'))
               .then((filePaths) => {
                   console.log(filePaths); // imprimirá un array de rutas de archivos seleccionados o undefined
               })
               .catch((error) => {
                   console.error(error);
               });
    

    Al usar invoke en lugar de send, puedes recibir el valor de retorno de la llamada a la función en el callback then. Si ocurre un error en el proceso principal, puedes capturarlo en el callback catch.

    ¡Espero que esto te ayude! Avísame si tienes alguna otra pregunta.

Comments are closed.