electron 为什么预加载回调不被解析?

gcuhipw9  于 2023-08-01  发布在  Electron
关注(0)|答案(1)|浏览(104)

我正在检查电子应用程序的自动更新。但我的回调不起作用。下面是我的代码的重要部分。

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。它正常工作,直到预加载功能。它将“预加载”记录到控制台。但回调函数不工作。我做错了什么?

b4wnujal

b4wnujal1#

这里的问题是当我调用updater?.showMessage()时,渲染器还没有准备好。所以,解决方案是等待渲染器准备好。这可以通过这样做来实现。

mainWindow.webContents.once('did-finish-load', () => {updater?.showMessage});

字符串

相关问题