簡體   English   中英

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

[英]MaterialApp and "MediaQuery.of() called with a context that does not contain a MediaQuery"

當我嘗試在我的應用程序中使用 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 需要任何具有 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"),
        ),
      ],
    ));
  }
}

發生此問題是因為您在 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
     ],
  );
),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM