Tutorial: Como Usar MediaQuery no Flutter

O que é MediaQuery?

O MediaQuery é um recurso poderoso do Flutter que permite acessar informações sobre o tamanho e a orientação da tela. Ele é essencial para criar interfaces responsivas que se adaptam a diferentes tamanhos de dispositivos.

Quando usar MediaQuery?

O MediaQuery pode ser usado sempre que você precisar ajustar o layout com base no tamanho da tela ou em outras propriedades, como largura, altura ou orientação. Exemplos comuns incluem:

  • Redimensionar widgets dinamicamente.
  • Ajustar espaçamento com base na largura da tela.
  • Alterar a orientação de elementos entre paisagem e retrato.

Configurando MediaQuery para Obter Tamanhos

A partir de versões recentes do Flutter, é possível usar MediaQuery.sizeOf(context) para obter as dimensões da tela de maneira mais direta e intuitiva.

                
                    import 'package:flutter/material.dart';

                    void main() {
                      runApp(const MyApp());
                    }

                    class MyApp extends StatelessWidget {
                      const MyApp({Key? key}) : super(key: key);

                      @override
                      Widget build(BuildContext context) {
                        return MaterialApp(
                          debugShowCheckedModeBanner: false,
                          home: MediaQueryExample(),
                        );
                      }
                    }

                    class MediaQueryExample extends StatelessWidget {
                      @override
                      Widget build(BuildContext context) {
                        final size = MediaQuery.sizeOf(context);

                        return Scaffold(
                          appBar: AppBar(
                            title: const Text("Exemplo MediaQuery"),
                          ),
                          body: Center(
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: [
                                Text("Largura: \${size.width.toStringAsFixed(2)}"),
                                Text("Altura: \${size.height.toStringAsFixed(2)}"),
                                if (size.width > 600)
                                  const Text("Modo Tablet")
                                else
                                  const Text("Modo Celular"),
                              ],
                            ),
                          ),
                        );
                      }
                    }
                
            

Ajustando Layouts com Base na Orientação

                
                    class OrientationExample extends StatelessWidget {
                      @override
                      Widget build(BuildContext context) {
                        final orientation = MediaQuery.orientationOf(context);

                        return Scaffold(
                          appBar: AppBar(
                            title: const Text("Exemplo de Orientação"),
                          ),
                          body: Center(
                            child: orientation == Orientation.portrait
                                ? const Text("Modo Retrato")
                                : const Text("Modo Paisagem"),
                          ),
                        );
                      }
                    }
                
            

Personalizando o Layout com Tamanhos Relativos

                
                    class ResponsiveLayoutExample extends StatelessWidget {
                      @override
                      Widget build(BuildContext context) {
                        final size = MediaQuery.sizeOf(context);

                        return Scaffold(
                          body: Padding(
                            padding: EdgeInsets.all(size.width * 0.05), // 5% da largura
                            child: Text(
                              "Texto Responsivo",
                              style: TextStyle(fontSize: size.width * 0.04), // 4% da largura
                            ),
                          ),
                        );
                      }
                    }
                
            

Conclusão

O MediaQuery continua sendo uma ferramenta essencial no Flutter para criar aplicações responsivas. Com o advento de novos métodos como MediaQuery.sizeOf(context), ficou ainda mais simples e intuitivo acessar informações sobre o tamanho da tela e adaptar os layouts dinamicamente.