如何在Flutter中获取屏幕尺寸而不需要BuildContext?

3
首先,这篇文章虽然与问题相似,但不符合我的需求,因为其中的答案并不能帮助我。
我有一个AppConfig来根据设备决定字体大小,以便于大型设备(例如平板电脑)可以获得稍微大一点的文本。我的配置在任何视图之前被调用,因此在此过程中我没有BuildContext。那么我该怎么做呢?
class AppConfig {
  static AppConfig _instance;

  static AppConfig instance() {
    if (_instance == null) {
      _instance = AppConfig();
    }
    return _instance;
  }

// config stuff for colours and themes

double width = MediaQuery.of(context).size.width;

if (width > 500) { //arbitrary number I haven't decided yet
    initWithBigFonts();
} else {
    initWithSmallFonts();
}

2
WidgetsBinding.instance.window 是什么意思? - pskink
@pskink 看起来像是我需要的东西,但是 - 我在这里该怎么使用它呢? - Maritn Ge
返回翻译后的文本:查看Window类的属性。 - pskink
5个回答

11

供未来参考的完整解决方案:

通过添加

Size size = WidgetsBinding.instance.window.physicalSize;
double width = size.width;
double height = size.height;

您可以从任何地方获取设备屏幕的尺寸,而无需使用BuildContext。


5

在这种情况下,您应该考虑设备像素比(devicePixelRatio);

Size size = WidgetsBinding.instance.window.physicalSize;
double ratio = WidgetsBinding.instance.window.devicePixelRatio;
double width = size.width / ratio;

3

自v3.7.0-32.0.pre版本起,“window”单例已被弃用,因为“window”假定应用程序由单个视图组成,而这不再是情况。您可以使用以下两个选项之一。

  • PlatformDispatcher.instance.views.first.physicalSize. 或者,
  • PlatformDispatcher.instance.implicitView?.physicalSize(可为空)

将物理大小除以设备像素比(PlatformDispatcher.instance.views.first.devicePixelRatio)以获取视图大小。

有关更多信息,请参见https://docs.flutter.dev/release/breaking-changes/window-singleton


1

更新

window已被弃用,不应再使用。请改用PlatformDispatcher

final view = WidgetsBinding.instance.platformDispatcher.views.first;
final size = view.physicalSize;
final pixelRatio = view.devicePixelRatio;

// Size in physical pixels:
final width = size.width;
final height = size.height;

// Size in logical pixels:
final width = size.width / pixelRatio;
final height = size.height / pixelRatio;

1

Size size = MediaQueryData.fromWindow(WidgetsBinding.instance.window).size;

尺寸大小 = 从窗口获取MediaQueryData后获得尺寸大小.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接