📅  最后修改于: 2023-12-03 15:22:21.554000             🧑  作者: Mango
在Flutter开发中,我们经常会使用 MediaQuery
来获取屏幕的一些信息和尺寸,但是有时候我们会遇到如下的警告:
'使用不包含 MediaQuery 的上下文调用 MediaQuery.of().'
这个警告的意思是我们在一些不包含 MediaQuery
的上下文中调用了 MediaQuery.of()
方法。
通常情况下,我们会在 MaterialApp
或者 WidgetsApp
的子树中创建 MediaQuery
,这样我们的整个应用程序都能够获取到 MediaQuery
提供的一些屏幕信息。但是如果我们在 MaterialApp
或者 WidgetsApp
的子树之外的其他子树中调用 MediaQuery.of()
方法,就会出现上面的警告。
这是因为当 MediaQuery
调用 of()
方法时,它会从当前的 BuildContext
中向上查找最近的 MediaQuery
并返回它,在子树中调用 MediaQuery.of()
方法时,由于它不在包含 MediaQuery
的上下文中,因此会出现警告。
如果你已经确定你的应用程序需要直接使用 MediaQuery.of()
方法,请考虑将 MediaQuery
在整个应用程序中都可用,可以通过以下方法解决:
MediaQuery
之内;Builder
组件将 MediaQuery
包裹在需要使用 MediaQuery.of()
方法的组件内部;BuildContext.inheritFromWidgetOfExactType()
来获取 MediaQuery
。class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MediaQuery(
data: MediaQueryData(),
child: Scaffold(
appBar: AppBar(),
body: Builder(
builder: (BuildContext context) {
MediaQueryData queryData = MediaQuery.of(context);
// TODO: 使用 queryData 获取屏幕信息和尺寸
},
),
),
),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
MediaQueryData queryData = context.inheritFromWidgetOfExactType(MediaQuery);
// TODO: 使用 queryData 获取屏幕信息和尺寸
return Container();
}
}
注意:以上示例代码仅供参考,具体实现方式根据自己的需求而定。