flutter 未找到MediaQuery小部件祖先

mwkjh3gx  于 2023-01-02  发布在  Flutter
关注(0)|答案(3)|浏览(147)
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'info.dart';

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

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  List<info> li = [
    info(name: 'text1', length: 170, date: DateTime.now()),
    info(name: 'text2', length: 175, date: DateTime.now()),
    info(name: 'text3', length: 180, date: DateTime.now()),
    info(name: 'text4', length: 180, date: DateTime.now()),
    info(name: 'text5', length: 180, date: DateTime.now()),
    info(name: 'text6', length: 180, date: DateTime.now()),
    info(name: 'text7', length: 180, date: DateTime.now()),
    info(name: 'text8', length: 180, date: DateTime.now()),
    info(name: 'text9', length: 180, date: DateTime.now()),
  ];

  void x (BuildContext ctx){
    showModalBottomSheet(context: ctx, builder: (ctx){
      return ListView.builder(
        itemCount: li.length,
        itemBuilder: (cx , index){
          return Padding(
            padding: EdgeInsets.all(10.0),
            child: Card(
              shadowColor: Colors.red,
              elevation: 10.0,
              color: Colors.blue,

              child: Padding(
                padding: const EdgeInsets.all(8.0),
                child: Column(
                  children: <Widget>[
                    Row(
                      mainAxisAlignment: MainAxisAlignment.spaceAround,
                      children: <Widget>[
                        Text(
                          li[index].name,
                          style: TextStyle(color: Colors.white, fontSize: 20),
                        ),
                        Text(
                          '${li[index].length}',
                          style: TextStyle(color: Colors.white, fontSize: 20),
                        ),
                      ],
                    ),
                    Text(
                      '${li[index].date}',
                      style: TextStyle(color: Colors.white, fontSize: 20),
                    ),
                  ],
                ),
              ),
            ),
          );
        },
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App name',
      home: Scaffold(
        appBar: AppBar(
          title: Text('This is the App bar'),
        ),
        body: Container(
          padding: EdgeInsets.all(10.0),
          height: double.infinity,
          color: Colors.black,
        ),
        floatingActionButton: FloatingActionButton(
          child: Icon(Icons.add),
          onPressed: () => x(context)
        ),
      ),
    );
  }
}

错误:
处理手势时引发了以下Assert:未找到MediaQuery小部件祖先。
MyApp小部件需要MediaQuery小部件祖先。找不到MediaQuery祖先的特定小部件为:我的应用程序状态:MyAppState#7e07c受影响小部件的所有权链为:"我的应用程序← [根目录]"

    • 从传递给MediaQuery. of()的上下文开始,**找不到MediaQuery祖先。发生这种情况的原因可能是您尚未添加WidgetsApp、CupertinoApp或MaterialApp小部件(这些小部件引入了MediaQuery),或者您使用的上下文来自这些小部件之上的小部件。

我的代码有什么问题?我已经使用了scaffold和MaterialApp小部件,讲师没有使用MediaQuery,我甚至不知道这意味着什么,但对他来说很有效!

qoefvg9y

qoefvg9y1#

这是一个常见的错误,当使用继承的小部件,如MediaQuery。现在你可能没有明确使用它,但从你的描述似乎Flutters的showModalBottomSheet方法可能使用它。
该错误告诉您在context之上找不到MediaQuery祖先(即WidgetsAppCupertinoAppMaterialApp)。这意味着在此context之上:

@override
Widget build(BuildContext context) {
 ...
}

这是正确的,因为您已经将MaterialApp小部件放置在此上下文的正下方,当您调用x(context)时,它将在build方法上方查找WidgetsAppCupertinoAppMaterialApp
有两种简单的方法来解决这个问题:
1.创建新的无状态/有状态小部件并将其传递给home参数,或者
1.使用Builder小部件并将其传递给home参数。

@override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App name',
      home: Builder(builder: (BuildContext context) { 
      ...
      } ),

这两个解决方案都将为您提供一个新的context,它将有一个MediaQuery小部件作为它的祖先。在小部件检查器中查看小部件树总是很有帮助的。

7xzttuei

7xzttuei2#

你也许想这么做
void main() {runApp(const MaterialApp(home: RandomName() ,));}'

class RandomName extends StatefulWidget {
  const RandomName({Key? key}) : super(key: key);

  @override
  _RandomNameState createState() => _RandomNameState();
}

class _RandomNameState extends State<RandomName> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

'

5kgi1eie

5kgi1eie3#

您需要使用MaterialApp对其进行 Package 。

MaterialApp( home: Scaffold(body: MyHomePage(),),);

相关问题