Flutter 在使用MaterialApp之前獲取MediaQueryData 2


在使用 flutter_screenutil 這個插件的時候,需要注冊

 ScreenUtil.init(context, width: 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, width: 750, height: 1560, allowFontScaling: true);
    return MyApp();
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM