window_manager
window_manager copied to clipboard
界面启动时窗口白屏
如果把example项目home.dart文件中,class _HomePageState #_buildBody
方法内的PreferenceList
列表,从'focus / blur'项目开始注释到最后,意图是让内容无法填充满example设置的默认size。在这个条件下启动窗口会白屏,没有任何内容显示,只有当鼠标进入窗口的区域内时,才恢复正常。
最开始,我是创建了一个空项目,一步步的跟随示例构建新的结构,就发现了这个白屏问题,但没有发现这个必现的条件。折腾了好一阵,发现只要是组件未将窗口尺寸填充满,就会这样。
不知道是我本机环境的问题,还是有其他的因素?
@lijy91
我研究了蛮久, 终于搞清楚了。。 用个空白页来启动,基本这个白屏是必现的。 因为这段代码失效了
@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的状态很正常。。。
对于这个问题也是头疼了很久,看到楼上回答有了启发(因为楼上给出的方案我没看懂……所以仅仅是启发) 测了下发现show()在widget树构建好后才运行会导致空白(不晓得这测的对不对),反正我保证show在runApp之前就执行完就没出现过白屏问题了。
...
await windowManager.waitUntilReadyToShow(windowOptions);
await windowManager.show();
runApp(Main());
这里要await waitUntilReadyToShow方法是因为如果不等待运行完,可能会先show再setSize,运行起来就会有点怪……
不过这种写法会导致另外一个问题,在debug模式运行代码时,会白屏很小一段时间,然后显示内容,但是在Profile模式下没这问题,build realease也是正常的。
一直白屏呢