Создание электронного окна с переменной для ширины и высоты не приводит ни к окну, ни к ошибке

#javascript #electron

#javascript #electron

Вопрос:

Я пытаюсь сделать что-то подобное, и я не получаю окна, когда пытаюсь это сделать. Что я мог пропустить?

Окно работает отлично, когда я запускаю его, используя прямые числовые ширину и высоту, но использование переменной приводит к тому, что оно не отображается.

 function createNewMainWindow() {
  var a = 1000;
  var b = 800;
  mainWindow = new BrowserWindow({
    show: true,
    width: a,
    height: b,
    minWidth: 300,
    minHeight: 300,
    frame: false,
    title: 'Recall',
    icon: iconPath,
    alwaysOnTop: false,
    useContentSize: false,
    webPreferences: {
      zoomFactor: 1,
      allowRunningInsecureContent: true,
      nodeIntegration: true,
    }
  });
}

app.on('ready', async () => {
  await installExtensions();
  createNewMainWindow();
  mainWindow.loadURL(`file://${__dirname}/app/app.html`); 
  mainWindow.show();
  mainWindow.focus();
}
  

Комментарии:

1. Вы mainWindow где-нибудь объявили? Я не уверен, связано ли это с вашей проблемой, но неясно, как ready обработчик и createNewMainWindow будет ссылаться на одно и то же значение.

2. Я подозреваю, что вы здесь опускаете важную деталь; BrowserWindow конструктор не может «знать», были ли указаны высота и ширина с помощью литералов или значений переменных. Возможно, упрощая свой пост, вы упускаете реальную проблему. Например, может быть, это не простая a и b переменная, а ситуация, когда ваши переменные не определены.

3. Я изменил свой код таким образом, что я определяю переменные точно так, как показано, жестко запрограммировано непосредственно перед вызовом функции, так что, похоже, это маловероятно. Я исключил другой код, однако все это работает, когда я использую числа, и терпит неудачу, когда я использую переменные, поэтому очень вероятно, что я что-то упускаю из виду в своем ограниченном примере кода.

4. Это действительно не должно быть возможным; значение — это значение. Вы выполняете перенос кода? Иногда это может объяснить странное поведение; в этом случае было бы полезно опубликовать вывод transpiler. В противном случае я не могу не подозревать, что вы на самом деле делаете что-то более сложное, чем a и b .

5. Попробуйте объявить mainWindow во внешней области видимости; Нетрудно представить, что у транспилятора для этой асинхронной функции возникают трудности с необъявленной переменной.

Ответ №1:

Похоже, что ваша функция mainwindow.loadUrl() вызывается до того, как она будет объявлена внутри вашей функции createNewMainWindow() . Вы могли бы попробовать это…

 function createNewMainWindow() {
var a = 1000;
var b = 800;
mainWindow = new BrowserWindow({
    show: true,
    width: a,
    height: b,
    minWidth: 300,
    minHeight: 300,
    frame: false,
    title: 'Recall',
    icon: iconPath,
    alwaysOnTop: false,
    useContentSize: false,
    webPreferences: {
      zoomFactor: 1,
      allowRunningInsecureContent: true,
      nodeIntegration: true,
    }
  });

  mainWindow.loadURL(`file://${__dirname}/app/app.html`);

  mainWindow.once('ready-to-show', () => {
    mainWindow.show();
    mainWindow.focus();
  });

}

app.on('ready', async () => {
  await installExtensions();
  createNewMainWindow();
}