window_manager icon indicating copy to clipboard operation
window_manager copied to clipboard

界面启动时窗口白屏

Open rcarlosdasilva opened this issue 1 year ago • 3 comments

如果把example项目home.dart文件中,class _HomePageState #_buildBody方法内的PreferenceList列表,从'focus / blur'项目开始注释到最后,意图是让内容无法填充满example设置的默认size。在这个条件下启动窗口会白屏,没有任何内容显示,只有当鼠标进入窗口的区域内时,才恢复正常。

最开始,我是创建了一个空项目,一步步的跟随示例构建新的结构,就发现了这个白屏问题,但没有发现这个必现的条件。折腾了好一阵,发现只要是组件未将窗口尺寸填充满,就会这样。

不知道是我本机环境的问题,还是有其他的因素?

@lijy91

rcarlosdasilva avatar Jul 22 '22 09:07 rcarlosdasilva

我研究了蛮久, 终于搞清楚了。。 用个空白页来启动,基本这个白屏是必现的。 因为这段代码失效了

  @override
  void onWindowFocus() {
    print('onWindowFocus');
    // Make sure to call once.
    setState(() {});
    // do something
  }

    windowManager.waitUntilReadyToShow(windowOptions, () async {
      await windowManager.show();
      await windowManager.focus();
    });

我拿了一下 windowManager.show(); 之前的 await windowManager.isFocused()的数据, 一般出现白屏就是show之前isFocused 已经是ture, 这时候你再调windowManager.focus() 已经不会触发onWindowFocus 所以没其他地方ui更新的话,就不会渲染界面了。

我的解决方案就是,在 waitUntilReadyToShow 后onWindowFocus 没调用的时候,再发一次事件,通知更新。这样就可以解决这个启动白屏了

环境:flutter sdk 3.0.5 win10 21H2 x64

特地找了一台 mac mini x86 试一下。。

12.5 用一样的代码, 在mac上没这毛病, focus的状态很正常。。。

youxiachai avatar Aug 09 '22 06:08 youxiachai

对于这个问题也是头疼了很久,看到楼上回答有了启发(因为楼上给出的方案我没看懂……所以仅仅是启发) 测了下发现show()在widget树构建好后才运行会导致空白(不晓得这测的对不对),反正我保证show在runApp之前就执行完就没出现过白屏问题了。

  ...
  await windowManager.waitUntilReadyToShow(windowOptions);
  await windowManager.show();
  runApp(Main());

这里要await waitUntilReadyToShow方法是因为如果不等待运行完,可能会先show再setSize,运行起来就会有点怪……

不过这种写法会导致另外一个问题,在debug模式运行代码时,会白屏很小一段时间,然后显示内容,但是在Profile模式下没这问题,build realease也是正常的。

FightingFZC avatar Jun 08 '23 20:06 FightingFZC

一直白屏呢

liuchuancong avatar Aug 25 '23 11:08 liuchuancong