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:
- 删除
MyAppbuild方法中、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
相关产品推荐
相关产品推荐

