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

Flutter报No MediaQuery widget ancestor found错误排查

问题定位

报错的核心原因是ScreenUtil.init调用位置错误。
MediaQuery实例是MaterialApp(以及WidgetsApp、CupertinoApp这类根应用组件)构建时才会向子树注入的祖先组件,你在MyApp的build方法中、返回MaterialApp之前就调用ScreenUtil.init(context, ...),此时传入的context是MaterialApp外层的上下文,根本无法获取到MediaQuery祖先,自然触发报错。你之前尝试的两种修改home参数的方案无效,是因为问题根本不在home对应的页面组件上,错误出在MaterialApp外层的初始化逻辑。

修复方案

推荐使用flutter_screenutil官方建议的全局初始化方式,通过MaterialApp的builder参数完成初始化,保证初始化时用到的context已经被MaterialApp注入了MediaQuery:

  • 删除MyApp build方法中、MaterialApp返回语句之前的ScreenUtil.init调用
  • 给MaterialApp添加builder参数,在builder回调中完成ScreenUtil初始化

修正后的main.dart代码如下:

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      // 全局初始化ScreenUtil
      builder: (context, child) {
        ScreenUtil.init(context, designSize: const Size(360, 640));
        return child!;
      },
      home: const HomeScreen()
    );
  }
}

home.dart的现有代码不需要调整,修改后重新运行即可解决报错,20.w这类适配方法也能正常生效。

注意:不要在任何位于MaterialApp/CupertinoApp/WidgetsApp外层的BuildContext上调用依赖MediaQuery的方法(包括ScreenUtil初始化、MediaQuery.of(context)调用等),这类上下文没有挂载应用组件注入的MediaQuery实例,必然触发找不到祖先组件的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:15:40