You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

flutter_screenutil与GetX集成报错求助:No MediaQuery widget ancestor found

解决flutter_screenutil与GetX集成时的MediaQuery缺失错误

错误原因

你当前的代码在ScreenUtilInit的designSize参数中直接调用MediaQuery.of(context),但此时MyApp作为根组件,还未被GetMaterialApp包裹——而MediaQuery是由GetMaterialApp(或MaterialApp、WidgetsApp)这类组件提供的,因此会触发"No MediaQuery widget ancestor found"错误。

修复方案

以下提供两种可行的修复方式,任选其一即可:

方式一:将ScreenUtilInit移至GetMaterialApp的builder中

利用GetMaterialApp的builder提供的context(已包含MediaQuery)来判断设备类型,再初始化ScreenUtil:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      themeMode: ThemeMode.system,
      debugShowCheckedModeBanner: false,
      home: SplashScreen(),
      builder: (context, widget) {
        // 此时context已由GetMaterialApp提供MediaQuery
        final isTablet = TabletDetector.isTablet(MediaQuery.of(context));
        return ScreenUtilInit(
          designSize: isTablet ? Size(834, 834) : Size(360, 690),
          builder: (_, __) => MediaQuery(
            // 固定文字缩放比例,不受系统字体大小影响
            data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
            child: widget!,
          ),
        );
      },
    );
  }
}

方式二:在main函数中提前判断设备类型

通过Flutter的window API获取物理尺寸,提前判断是否为平板,再传入MyApp:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 通用平板判断标准:最短边逻辑像素≥600
  final physicalSize = WidgetsBinding.instance.window.physicalSize;
  final devicePixelRatio = WidgetsBinding.instance.window.devicePixelRatio;
  final shortestSide = (physicalSize.shortestSide / devicePixelRatio).round();
  final isTablet = shortestSide >= 600;

  runApp(MyApp(isTablet: isTablet));
}

class MyApp extends StatelessWidget {
  final bool isTablet;

  const MyApp({super.key, required this.isTablet});

  @override
  Widget build(BuildContext context) {
    return ScreenUtilInit(
      designSize: isTablet ? Size(834, 834) : Size(360, 690),
      builder: (_, __) => GetMaterialApp(
        themeMode: ThemeMode.system,
        debugShowCheckedModeBanner: false,
        home: SplashScreen(),
        builder: (context, widget) {
          return MediaQuery(
            data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
            child: widget!,
          );
        },
      ),
    );
  }
}

注意事项

  • 方案一保留了你原本使用TabletDetector的逻辑,适合依赖自定义平板判断规则的场景;
  • 方案二不依赖MediaQuery,适合在初始化阶段就需要确定设备类型的场景;
  • 修复后,使用ScreenUtil().setWidth()、ScreenUtil().setHeight()等方法时,就能正常获取适配后的尺寸。

内容的提问来源于stack exchange,提问作者Tarun Yadvendu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:40:30