使用不包含 MediaQuery 的上下文调用 MediaQuery.of()。 (紧急援助)

Posted

技术标签:

【中文标题】使用不包含 MediaQuery 的上下文调用 MediaQuery.of()。 (紧急援助)【英文标题】:MediaQuery.of() called with a context that does not contain a MediaQuery. (emergency aid) 【发布时间】:2020-09-20 20:33:54 【问题描述】:

我删除了“MaterialApp”代码块,因为我一开始无法编写我想要的代码。

现在出现错误,我该如何解决?我必须在很短的时间内处理这个问题,我必须把我写的代码放在“MaterialApp”块中,但我做不到。

你能帮帮我吗?

class MyApp extends StatelessWidget 
@override
Widget build(BuildContext context) 
    return CupertinoTabScaffold(
        tabBar: CupertinoTabBar(
            items: < BottomNavigationBarItem > [
                new BottomNavigationBarItem(
                    icon: new Icon(Icons.home),
                    title: Text('Enes'),
                ),
                new BottomNavigationBarItem(
                    icon: new Icon(Icons.bluetooth),
                    title: Text('Mehmet'),
                ),
            ],
        ),
        tabBuilder: (BuildContext context, int index) 
            return CupertinoTabView(
                builder: (BuildContext context) 
                    return CupertinoPageScaffold(
                        navigationBar: CupertinoNavigationBar(
                            middle: Text('Page 1 of tab $index'),
                        ),
                        child: Center(
                            child: CupertinoButton(
                                child: const Text('Next Page'),
                                    onPressed: () 
                                        Navigator.of(context).push(
                                            CupertinoPageRoute < void > (
                                                builder: (BuildContext context) 
                                                    return CupertinoPageScaffold(
                                                        navigationBar: CupertinoNavigationBar(
                                                            middle: Text('Page 2 of tab $index'),
                                                        ),
                                                        child: Center(
                                                            child: CupertinoButton(
                                                                child: const Text('Back'),
                                                                    onPressed: () 
                                                                        Navigator.of(context).pop();
                                                                    ,
                                                            ),
                                                        ),
                                                    );
                                                ,
                                            ),
                                        );
                                    ,
                            ),
                        ),
                    );
                ,
            );
        ,
    );

【问题讨论】:

这能回答你的问题吗? Flutter Error: MediaQuery.of() called with a context that does not contain a MediaQuery 【参考方案1】:

不确定为什么它必须在 MaterialApp 中。这个解决方案是我过去部署的:

在您的 MaterialApp 中,SetupStuff(可以命名为任何名称)设置为您的 home 或 initialRoute。

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      color: Colors.yellow[100],
      debugShowCheckedModeBanner: false,
      title: 'MyApp',
      theme: currentTheme,
      home: SetupStuff(),
    );
  


class SetupStuff extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    //  This is the first 'context' with a MediaQuery, therefore,
    //  this is the first opportunity to set MediaQuery based values

    //Set values / do things here.

    WidgetsBinding.instance.addPostFrameCallback((_) 
      Navigator.pushReplacement(context,
          MaterialPageRoute(builder: (BuildContext context) => AlsoMyApp()));
    );

    return SafeArea(child: Material(color: Colors.yellow[300]));
  

【讨论】:

对不起,我是这个程序的新手。当我编写您丢弃的代码时,“Router”、“splashRoute”和“currentTheme”代码中出现错误。你能把它应用到我写的代码上并分享吗? 将您的“MyApp”重命名为“AlsoMyApp”。并尝试上面的代码。有关此问题的更多详细信息,请参见上面 Nae 提供的链接。【参考方案2】:

您似乎想开发一个带有 ios 元素的应用程序。如果是这样,您需要将MaterialApp 替换为CupertinoApp。如果不是,您不得删除MaterialApp,因为它是必须存在的。

class CupertinoApp extends StatelessWidget 
@override
Widget build(BuildContext context) 
   return CupertinoApp(
     home: CupertinoHomePage(),
    );
  

希望对你有帮助。

【讨论】:

以上是关于使用不包含 MediaQuery 的上下文调用 MediaQuery.of()。 (紧急援助)的主要内容,如果未能解决你的问题,请参考以下文章

使用 MediaQuery 的响应式元素对齐 - 使用不包含它的上下文调用

Flutter 错误:(Webview) Media Query.of() 使用不包含媒体查询的上下文调用

如何解决 Flutter 中的 MediaQuery 错误? [复制]

在颤动中使用 MediaQuery 的高度和宽度大小时出错

Flutter 问题:从上下文开始找不到 MediaQuery 祖先

@MediaQuery 在 CSS 中调用