Flutter Error: MediaQuery.of() called with a context that does not contain a MediaQuery

后端 未结 14 1038
借酒劲吻你
借酒劲吻你 2020-11-28 14:05

I have been trying to get the size of the whole context view in Flutter. But every time I try I\'m getting the above mentioned error. Here\'s my code:

impor         


        
相关标签:
14条回答
  • 2020-11-28 14:42

    Add MaterialApp ...

    void main() { runApp(MaterialApp( home: HomePage(), )); }

    0 讨论(0)
  • 2020-11-28 14:45

    You need a MaterialApp or a WidgetsApp around your widget. They provide the MediaQuery. When you call .of(context) flutter will always look up the widget tree to find the widget.

    You usually have this in your main.dart:

    void main() => runApp(App());
    
    class App extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Title',
          theme: kThemeData,
          home: HomePage(),
        );
      }
    }
    
    class HomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        final size = MediaQuery.of(context).size;
    
        return Container(
          child: ...,
        );
      }
    }
    
    0 讨论(0)
  • 2020-11-28 14:45

    There is better way. Above solutions would require you to have only one screen widget or inherit all screens from parent class. But there is solution, place the media query initialization into onGenerateRoute callback function

    main.dart

    import 'package:flutter/material.dart';
    
    class MyApp extends StatefulWidget {
        @override
        State<StatefulWidget> createState() => new MyAppState();
    }
    
    class MyAppState extends State<MyApp> {
        @override
        Widget build(BuildContext context) {
          return MaterialApp(
            title: 'My Awesome App',
            routes: NavigationUtils.routeList(),
            onGenerateRoute: (routeSettings) =>
              NavigationUtils.onGenerateRoute(routeSettings),
          );
        }
    }
    

    NavigationUtils.dart

    import 'package:flutter/material.dart';
    
    class NavigationUtils {
        static onGenerateRoute(RouteSettings routeSettings) {   
          return new MaterialPageRoute(
            builder: (context) {
              WidgetUtils.me.init(context);
                return StorageUtils.me.isLogged() ? HomeScreen() : ForkScreen();
            },
            settings: routeSettings,
          );
        }
    }
    

    WidgetUtils.dart

    import 'package:flutter/material.dart';
    
    class WidgetUtils {
        MediaQueryData _mediaQueryData;
        double _screenWidth;
        double _screenHeight;
        double _blockSizeHorizontal;
        double _blockSizeVertical;
    
        init(BuildContext context) {
            _mediaQueryData = MediaQuery.of(context);
            screenWidth = _mediaQueryData.size.width;
            screenHeight = _mediaQueryData.size.height;
            blockSizeHorizontal = screenWidth / 100;
            blockSizeVertical = screenHeight / 100;
        }
    }
    

    Warning: It is not copy & paste code, there are some singletons etc. but you should get the point ;)

    0 讨论(0)
  • 2020-11-28 14:45
    import 'package:flutter/material.dart';
    
    void main() => runApp(App());
    
    class App extends StatelessWidget {
    
      @override
     
     Widget build(BuildContext context) {
        
       return MaterialApp(
        
          home: Scaffold(
          body:HomePage(),
          ),
        );
       }
    
    }
    
    
    class HomePage extends StatelessWidget {
    
      @override
    
      Widget build(BuildContext context) {
    
        var size = MediaQuery.of(context).size.height;
    
        return Container(
          height:size/2,
          color:Colors.lightBlueAccent,
            
        );
      }
    
    }
    

    YOU SHOULD TRY THIS I HAVE DONE IT.

    0 讨论(0)
  • 2020-11-28 14:47

    I fixed it by using the following method. First I created a new class named MyWidget and returned it in MyApp within a MaterialApp's home:. Refer code below:

    import 'package:flutter/material.dart';
    
    void main => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
    
        return new MaterialApp(
          home: new MyWidget(),
        );
      }
    } 
    
    class MyWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
    
        final size = MediaQuery.of(context).size;
        return new MaterialApp(
          home: new Scaffold(),
        );
      }
    } 
    

    Also, declaring size as final doesn't matter. Orientation/Rotation is handled.

    0 讨论(0)
  • 2020-11-28 14:48

    I was trying to change the package then this error arise, so make sure you complete each of the following steps

    https://stackoverflow.com/a/51550358/4993045

    0 讨论(0)
提交回复
热议问题