You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Windows桌面端应用如何正确获取4K显示器真实屏幕尺寸

Flutter Windows桌面端获取真实屏幕尺寸解决方案

异常原因说明

  • WidgetsBinding.instance.window.physicalSize 实际返回的是当前Flutter应用窗口的物理渲染尺寸,并非系统显示器的全局物理分辨率,且返回值默认受Windows系统DPI缩放系数影响,因此与4K显示器真实尺寸不符
  • DesktopWindow.getWindowSize() 返回Size(0.0, 0.0)是调用时机过早导致,应用窗口未完成初始化挂载时读取窗口尺寸就会返回空值,且该方法本身仅能获取应用窗口自身尺寸,无法拿到显示器全局尺寸

正确获取方案

方案1:使用screen_retriever插件(推荐)

该插件专门用于桌面端屏幕信息获取,可直接读取显示器原始物理分辨率,不受系统DPI缩放影响。

  1. 在pubspec.yaml中添加依赖:
dependencies:
  screen_retriever: ^0.2.0
  1. 调用示例:
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获取分辨率:

  1. 在项目windows/runner/main.cpp中注册MethodChannel,调用EnumDisplaySettingsW等Win32 API读取显示器原始分辨率并返回给Dart层
  2. Dart层调用对应MethodChannel方法接收返回值即可

补充注意事项

  • 所有异步读取屏幕/窗口信息的操作,不要在应用初始化阶段(runApp执行前)调用,避免读取失败
  • 如果需要获取应用窗口自身的尺寸,可使用window_manager插件的windowManager.getSize()方法,或等待窗口初始化完成后再调用DesktopWindow相关方法,即可避免返回0值的问题

内容的提问来源于stack exchange,提问作者derChris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:45:10