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
相关产品推荐
相关产品推荐

