• Flutter 在使用MaterialApp之前获取MediaQueryData 2


    在使用 flutter_screenutil 这个插件的时候,需要注册

     ScreenUtil.init(context,  750, height: 1560, allowFontScaling: true);

    这句话,需要放那里呢?一般情况下都是放到MaterialApp之后的HomePage上。

    这样子就出现一个问题了。我需要在MaterialApp配置主题上就需要用到 flutter_screenutil 插件

    ScreenUtil().setSp(getPrimaryTextSize())

    所以必须需要将  ScreenUtil.init 放到MaterialApp之前。

    代码如下:

    void main() {
      runApp(MediaQueryFromWindow(
        child: ScreenApp(),
      ));
    }
    
    class MediaQueryFromWindow extends StatefulWidget {
      const MediaQueryFromWindow({
        Key key,
        @required this.child,
      }) : super(key: key);
    
      final Widget child;
    
      @override
      _MediaQueryFromWindowsState createState() => _MediaQueryFromWindowsState();
    }
    
    class _MediaQueryFromWindowsState extends State<MediaQueryFromWindow> with WidgetsBindingObserver {
      @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addObserver(this);
      }
    
      // ACCESSIBILITY
    
      @override
      void didChangeAccessibilityFeatures() {
        setState(() {
          // The properties of window have changed. We use them in our build
          // function, so we need setState(), but we don't cache anything locally.
        });
      }
    
      // METRICS
    
      @override
      void didChangeMetrics() {
        setState(() {
          // The properties of window have changed. We use them in our build
          // function, so we need setState(), but we don't cache anything locally.
        });
      }
    
      @override
      void didChangeTextScaleFactor() {
        setState(() {
          // The textScaleFactor property of window has changed. We reference
          // window in our build function, so we need to call setState(), but
          // we don't need to cache anything locally.
        });
      }
    
      // RENDERING
      @override
      void didChangePlatformBrightness() {
        setState(() {
          // The platformBrightness property of window has changed. We reference
          // window in our build function, so we need to call setState(), but
          // we don't need to cache anything locally.
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return MediaQuery(
          data: MediaQueryData.fromWindow(WidgetsBinding.instance.window),
          child: widget.child,
        );
      }
    
      @override
      void dispose() {
        WidgetsBinding.instance.removeObserver(this);
        super.dispose();
      }
    }
    
    class ScreenApp extends StatefulWidget {
      @override
      _ScreenAppState createState() => _ScreenAppState();
    }
    
    class _ScreenAppState extends State<ScreenApp> with WidgetsBindingObserver {
      @override
      Widget build(BuildContext context) {
        // 注册
        ScreenUtil.init(context,  750, height: 1560, allowFontScaling: true);
        return MyApp();
      }
    }
  • 相关阅读:
    Spring源码情操陶冶-自定义节点的解析
    SpringMVC源码情操陶冶-DispatcherServlet
    springcloud config配置读取优先级
    Maven-常用插件
    springcloud情操陶冶-springcloud config server(三)
    springcloud情操陶冶-springcloud config server(二)
    springcloud情操陶冶-bootstrapContext(三)
    springcloud情操陶冶-springcloud config server(一)
    springcloud情操陶冶-bootstrapContext(二)
    springcloud情操陶冶-bootstrapContext(一)
  • 原文地址:https://www.cnblogs.com/hbolin/p/12605085.html
Copyright © 2020-2023  润新知