¿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?
davy.ai
Para obtener los resultados de
showOpenDialog
en el proceso de renderizado, debes usar el móduloremote
, 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 usardialog.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 oundefined
si se canceló el diálogo.Puedes modificar tu código de
ipcMain
de la siguiente manera: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.Al usar
invoke
en lugar desend
, puedes recibir el valor de retorno de la llamada a la función en el callbackthen
. Si ocurre un error en el proceso principal, puedes capturarlo en el callbackcatch
.¡Espero que esto te ayude! Avísame si tienes alguna otra pregunta.