在 Flutter 中获取没有构建上下文的类中的屏幕大小

Man*_*gle 6 dart flutter

我试图在没有构建方法的自定义类中获取颤动的屏幕大小。如何在不使用 buildcontext 类的情况下获得屏幕大小?

以下代码:

class ShapesPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {

    BuildContext context;
    double width = MediaQuery.of(context).size.width;
    double height = MediaQuery.of(context).size.height;
    final paint = Paint();

    paint.color = Colors.deepOrange;

    var center = Offset(size.width / 2, size.height / 2);

    print(height);
    print(width);

    Rect rect = Rect.fromLTWH(0.0, 0.0, width, height);
    canvas.drawRect(rect, paint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

给出以下错误:

在paint()期间抛出以下断言:'package:flutter/src/widgets/media_query.dart':失败的断言:第689行pos 12:'context != null':不是真的。

小智 57

使用

MediaQueryData.fromWindow(WidgetsBinding.instance.window);
Run Code Online (Sandbox Code Playgroud)

您可以使用它来获取 MediaQuery 而不需要上下文它依赖于窗口实例来获取大小信息

  • 这是此页面上唯一真正回答原始问题且正确的答案。 (6认同)
  • @Apoorvpandey 只需添加一个感叹号并告诉编译器您知道自己在做什么,就像这样 `MediaQueryData.fromWindow(WidgetsBinding.instance!.window)` (3认同)

Moh*_*wan 21

截至 2023 年 5 月,Flutter 3.10.1 中MediaQueryData.fromWindow()已弃用。WidgetsBinding.instance.platformDispatcher.views.first.physicalSize.width现在使用。将宽度替换为高度即可获取屏幕的高度


Son*_*low 5

如果您需要的话,您可以直接传递屏幕的widthheight作为小部件的参数。ShapesPainter

解决方案代码:

class ShapesPainter extends CustomPainter {

  final double width;
  final double height;

  ShapesPainter({this.width,this.height});

  @override
  void paint(Canvas canvas, Size size) {

    final paint = Paint();

    paint.color = Colors.deepOrange;

    var center = Offset(size.width / 2, size.height / 2);

    print(height);
    print(width);

    Rect rect = Rect.fromLTWH(0.0, 0.0, width, height);
    canvas.drawRect(rect, paint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

// Wherever you'll be using it
ShapesPainter(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
)
Run Code Online (Sandbox Code Playgroud)

  • 如果您愿意,您甚至可以使用“double.infinity”。 (2认同)