我正在检查电子应用程序的自动更新。但我的回调不起作用。下面是我的代码的重要部分。
updater.ts
export default class Updater {
mainWindow: BrowserWindow;
constructor(mainWindow: BrowserWindow) {
this.mainWindow = mainWindow;
}
showMessage(message: String) {
console.log('showMessage trapped');
console.log(message);
this.mainWindow.webContents.send('updateMessage', message);
}
}
字符串
main.ts
const createWindow = () => {
mainWindow = new BrowserWindow({
frame: false,
show: false,
width: 400,
height: 600,
icon: getAssetPath('icon.png'),
webPreferences: {
preload: app.isPackaged
? path.join(__dirname, 'preload.js')
: path.join(__dirname, '../../.erb/dll/preload.js'),
nodeIntegration: true,
contextIsolation: true,
},
});
mainWindow.on('closed', () => {
mainWindow = null;
});
mainWindow.webContents.openDevTools({ mode: 'undocked' });
updater = new Updater(mainWindow);
};
app
.whenReady()
.then(() => {
createWindow();
app.on('activate', () => {
if (mainWindow === null) createWindow();
});
autoUpdater.checkForUpdates();
updater?.showMessage('Checking for Updates');
})
.catch(console.log);
型
preload.ts
import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron';
const updateApp = {
updateMessage: (callback: any) => {
console.log("Preload");
ipcRenderer.on('updateMessage', callback);
},
};
contextBridge.exposeInMainWorld('update', updateApp);
型
App.tsx
export default function App() {
let msg:String;
useEffect(() => {
window.update.updateMessage(updateMessage);
}, []);
const updateMessage = (e: any, message: String) => {
console.log('updateMessageCallback');
console.log(message);
console.log('message logged in view');
};
const showPopUp = () => {
window.my_modal_1.showModal();
};
return (
<div className="min-h-screen flex flex-col">
<StartingPopUp showPopUp={showPopUp} />
<TitleBar />
<UpdateNotification message={msg} />
<Navbar />
<Logo />
<div className="flex flex-col flex-1 p-6">
<CommandsContainer />
</div>
<Progress />
</div>
);
}
型
它将 showMessage trapped Checking for Updates 记录到控制台。这些都是来自updater类的方法。然后将 Preload 记录到控制台。来自updateAppBridge的updateMsg
。它正常工作,直到预加载功能。它将“预加载”记录到控制台。但回调函数不工作。我做错了什么?
1条答案
按热度按时间b4wnujal1#
这里的问题是当我调用
updater?.showMessage()
时,渲染器还没有准备好。所以,解决方案是等待渲染器准备好。这可以通过这样做来实现。字符串