【问题标题】:MaterialApp and "MediaQuery.of() called with a context that does not contain a MediaQuery"MaterialApp 和“使用不包含 MediaQuery 的上下文调用的 MediaQuery.of()”
【发布时间】:2020-07-27 02:36:50
【问题描述】:

当我尝试在我的应用程序中使用 MediaQuery 时,我收到以下错误:

“使用不包含 MediaQuery 的上下文调用 MediaQuery.of()”

我做了一些研究,我读到的所有内容都表明,如果我使用 MaterialApp 或 WidgetsApp,我应该可以访问 MediaQuery。

但是,我在使用 MediaQuery 的位置使用 MaterialApp 作为父小部件...所以我不明白为什么我无法在我使用的上下文中访问 MediaQuery...??

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  List<Map<String, String>> elementList;
  String elementName;

  MyApp() {
    this.elementName = "TestName";
    this.elementList = List<Map<String, String>>();
    this.elementList.add({"element1": "Value1"});
    this.elementList.add({"element2": "Value2"});
    this.elementList.add({"element3": "Value3"});
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Column(
        children: <Widget>[

          Container(
            height: MediaQuery.of(context).size.height * 0.15,
            child: UNavbar(),
            ),

          Container(
            height: MediaQuery.of(context).size.height * 0.7,
            child: ListView.builder(              
              itemBuilder: (ctx, index) {
               return UNode(elementName, elementList);              
              }              
            )
          ),          
          Container(
            height: MediaQuery.of(context).size.height * 0.15,
            alignment: Alignment.bottomCenter,
            child: UTextbox(),
          ),

        ],
      ),
    );
  }
}```

【问题讨论】:

  • 你不需要任何MediaQuery.of - 你需要的是Flexible.flex 属性
  • 谢谢,这看起来是一种更简洁的对齐方式。但我仍然想知道为什么在这种情况下我无法访问 MediaQuery。
  • 因为您使用的contextMaterialApp 的父级,而不是它的子级

标签: flutter


【解决方案1】:

我认为 MediaQuery 需要任何具有 Mediadata 作为 Materialapp 的父小部件,因此,如果您创建一个包含 MaterialApp 小部件的单独小部件,然后将所有其他代码放在单独的小部件中。它会起作用的。

注意:我用文本小部件替换了所有小部件,并用脚手架包裹列,否则你会黑屏。

以下代码可帮助您了解更多信息。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  List<Map<String, String>> elementList;
  String elementName;

  MyApp() {
    this.elementName = "TestName";
    this.elementList = List<Map<String, String>>();
    this.elementList.add({"element1": "Value1"});
    this.elementList.add({"element2": "Value2"});
    this.elementList.add({"element3": "Value3"});
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: Home());
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
     body: Column(
      children: <Widget>[
        Container(
          height: MediaQuery.of(context).size.height * 0.15,
          child: Text(""),
        ),
        Container(
            height: MediaQuery.of(context).size.height * 0.7,
            child: ListView.builder(itemBuilder: (ctx, index) {
              return Text("");
            })),
        Container(
          height: MediaQuery.of(context).size.height * 0.15,
          alignment: Alignment.bottomCenter,
          child: Text("data"),
        ),
      ],
    ));
  }
}

【讨论】:

    【解决方案2】:

    出现问题是因为您在 MediaQuery 中使用的上下文没有与之关联的 MaterialApp。它作为 build 方法的参数传递,您正在同一个 build 方法中创建材质应用程序。要解决此问题,您可以使用 Builder 小部件。

    home: Builder(builder: (context) {
      return Column(
         children: <Widget>[
           Container(
             height: MediaQuery.of(context).size.height * 0.15,
             child: UNavbar(),
             ),
           // Remaining Children
         ],
      );
    ),
    

    【讨论】:

      猜你喜欢
      • 2020-02-17
      • 2019-12-18
      • 2020-11-22
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      相关资源
      最近更新 更多