Flutter Windows桌面端应用如何正确获取4K显示器真实屏幕尺寸
Flutter Windows桌面端获取真实屏幕尺寸解决方案
异常原因说明
WidgetsBinding.instance.window.physicalSize实际返回的是当前Flutter应用窗口的物理渲染尺寸,并非系统显示器的全局物理分辨率,且返回值默认受Windows系统DPI缩放系数影响,因此与4K显示器真实尺寸不符DesktopWindow.getWindowSize()返回Size(0.0, 0.0)是调用时机过早导致,应用窗口未完成初始化挂载时读取窗口尺寸就会返回空值,且该方法本身仅能获取应用窗口自身尺寸,无法拿到显示器全局尺寸
正确获取方案
方案1:使用screen_retriever插件(推荐)
该插件专门用于桌面端屏幕信息获取,可直接读取显示器原始物理分辨率,不受系统DPI缩放影响。
- 在
pubspec.yaml中添加依赖:
dependencies: screen_retriever: ^0.2.0
- 调用示例:
import 'package:screen_retriever/screen_retriever.dart'; // 建议在页面第一帧渲染完成后调用,比如放在initState的addPostFrameCallback回调中 Future<void> getDisplayRealSize() async { // 获取主显示器信息 Display primaryDisplay = await screenRetriever.getPrimaryDisplay(); // 输出即为显示器真实物理分辨率,4K屏对应宽3840、高2160 print('屏幕真实宽度:${primaryDisplay.size.width}'); print('屏幕真实高度:${primaryDisplay.size.height}'); // 多显示器场景可调用以下方法获取所有显示器的信息列表 // List<Display> allDisplays = await screenRetriever.getAllDisplays(); }
方案2:通过Win32原生API自行实现
如果不想引入第三方插件,可通过MethodChannel调用Windows原生API获取分辨率:
- 在项目
windows/runner/main.cpp中注册MethodChannel,调用EnumDisplaySettingsW等Win32 API读取显示器原始分辨率并返回给Dart层 - Dart层调用对应MethodChannel方法接收返回值即可
补充注意事项
- 所有异步读取屏幕/窗口信息的操作,不要在应用初始化阶段(runApp执行前)调用,避免读取失败
- 如果需要获取应用窗口自身的尺寸,可使用window_manager插件的
windowManager.getSize()方法,或等待窗口初始化完成后再调用DesktopWindow相关方法,即可避免返回0值的问题
内容的提问来源于stack exchange,提问作者derChris
相关产品推荐
相关产品推荐

