【问题标题】:How do you access mediaquery.of(context).width.height outside of a build method?如何在构建方法之外访问 mediaquery.of(context).width.height?
【发布时间】:2019-07-20 15:32:21
【问题描述】:

我并不特别需要访问 mediaquery 方法,只要返回本机设备的高度和宽度即可。我想要实现的是一个响应式主题,它将根据设备的大小缩放文本大小。

【问题讨论】:

  • 您实际上想访问什么?你的问题有点含糊。
  • 设备尺寸
  • 但是你在哪里需要它,因为它无法访问上下文?我想你需要尺寸来渲染某些东西,如果你要渲染,你可能会被BuildContext覆盖。
  • 我正在定义一个主题,我想根据用户设备尺寸缩放文本。在我定义我的主题的地方我无权访问构建上下文。
  • 你知道aText实际上已经根据像素密度自动缩放了吗?如果您要使用具有某些fontSize 条件的主题(即,如果大屏幕字体大小:如果不是,则为 40,到 20),那么我建议您利用 ThemeDataTextTheme 属性,然后在你的build 选择中使用它,例如,Theme.of(context).textTheme.display3 如果屏幕很大,display1 如果很小。但这只是一个例子,我想说的是您的主题理想情况下应该使用静态属性。

标签: flutter


【解决方案1】:

您不能直接在 build 方法之外访问 Context 对象。您可以将 Context 对象从 build 方法内部传递给单独的 build 函数。

Widget build(BuildContext context){
  return Container(
    children: buildChildren(context)
  );
}

Widget buildChildren(BuildContext context){
  ...
}

【讨论】:

    【解决方案2】:

    这正是我在我的应用程序中所做的,我也不想使用 mediacontext(因为有时我没有上下文),看看下面的例子:

    https://github.com/lhcdims/statemanagement02

    尝试查看 lib/ScreenVariables.dart 中的类 'sv'

    并在 main.dart 中调用 sv.init(),然后您可以在任何 dart 文件中的任何位置使用 sv.screenwidth、sv.defaultfontsize ...等。

    【讨论】:

    • 这样做的开销是多少?
    【解决方案3】:

    这样做很简单。这就是我在 StatefulWidget 中的做法:

    class MyPage extends StatefulWidget {
     
      @override
      _MyPageState createState() => _MyPageState();
    }
    
    class _MyPageState extends State<MyPage> {
     
       var screenHeight = window.physicalSize.height / window.devicePixelRatio;
       var screenWidth = window.physicalSize.width / window.devicePixelRatio;
       .    .    .    .
       .    .    .    .
       .    .    .    .
    

    【讨论】:

    • 在最近的 Flutter 和 Dart 中没有获取 physicalSize 的方法。
    • 看这里,需要import 'dart:ui'
    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 2021-12-02
    • 2014-01-15
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多