MediaQuery — mi ez, működési elv és adaptív elrendezések

Szerző: IT Sectr Megjelenés: 2026-07-03 Olvasási idő: 7 perc

MediaQuery — objektum a Flutter-ben, amely információt nyújt a jelenlegi média környezetről: képernyőméret, eszköz tájolása, pixelsűrűség, rendszermargók és betűméret. MediaQueryData — tároló az összes ilyen mérőszámhoz, elérhető a MediaQuery.of(context) segítségével. A Flutter hivatalos dokumentációja szerint (2026) a MediaQuery az adaptív tervezés alapja: segítségével meghatározzák, hogy mobil vagy tablet elrendezés jelenjen meg, kiszámítják a safe area margóit és kiválasztják az elemek méretét a képernyőhöz viszonyítva.

Főbb pontok

  • MediaQuery — osztály a képernyő mérőszámainak lekéréséhez: méret, tájolás, sűrűség, margók
  • MediaQuery.of(context) — fő hozzáférési mód az adatokhoz BuildContext-en keresztül
  • Size (MediaQuery.size) — a képernyő szélessége és magassága logikai pixelekben
  • ViewPadding — rendszermargók (állapotsor, notch, rendszernavigáció)
  • Orientation — az eszköz álló vagy fekvő tájolása

Mi a MediaQuery

MediaQuery — egy widget és osztály a Flutter-ben, amely adatokat szolgáltat az alkalmazás média környezetéről. A MediaQuery az egész alkalmazást a MaterialApp vagy CupertinoApp gyökér widgetbe csomagolja, és bármely gyermek widget elérheti ezeket az adatokat a MediaQuery.of(context) segítségével.

Amikor a Flutter elindítja az alkalmazást, létrehoz egy MediaQueryData példányt, amely az aktuális eszköz összes mérőszámát tartalmazza. Ezek az adatok automatikusan frissülnek változások esetén: eszköz elforgatása, ablakméret változása (asztali gépen), billentyűzet megjelenése vagy a rendszer akadálymentesítési beállításainak változása. A MediaQuery minden adatváltozáskor újraépíti a widgetek részgráfját, biztosítva a felület reaktív alkalmazkodását.

A MediaQueryData a következőket tartalmazza: size (képernyőméret), devicePixelRatio (pixelsűrűség), textScaleFactor (betűméret skála a rendszerbeállításokból), viewInsets (billentyűzet által takart terület), viewPadding (rendszermargók), orientation (tájolás) és platformBrightness (világos vagy sötét téma).

Következtetés: MediaQuery — az eszközinformáció központi forrása a Flutter-ben. A MediaQuery.of(context) elérése az első lépés bármely adaptív felület építésében.

A MediaQueryData fő tulajdonságai

MediaQueryData több tucat tulajdonságot tartalmaz, de a leggyakrabban használtak azok, amelyek az elrendezés építését befolyásolják. Tekintsük át a legfontosabbakat.

Size — képernyőméret

MediaQuery.of(context).size egy Size objektumot ad vissza a képernyő szélességével és magasságával logikai pixelekben (device-independent pixels, dip). Ezek az értékek nem veszik figyelembe a rendszermargókat. Az adaptív elrendezések számításához a size az elsődleges mérőszám: alapján határozzák meg a breakpoints-okat mobil, tablet és asztali elrendezésekhez.

ViewPadding — rendszermargók

ViewPadding — margók, amelyeket a rendszer foglal le az állapotsor, notch (képernyő kivágás), rendszernavigációs panel és home indikátor (iOS-en) számára. E margók figyelembevétele nélkül a tartalom a rendszerelemek alá kerülhet. A MediaQuery.of(context).padding EdgeInsets-t ad vissza, amelyet padding-ként kell alkalmazni az oldal gyökér konténerére.

ViewInsets — billentyűzet terület

ViewInsets — a képernyő területe, amelyet a szoftveres billentyűzet takar. Bemeneti mezők esetén kritikus a viewInsets.bottom figyelése, hogy a tartalmat a billentyűzet fölé emeljük. A Flutter ezt automatikusan kezeli a scaffold-ban, de egyéni elrendezésekhez közvetlenül a MediaQuery.of(context).viewInsets használandó.

Orientation — eszköz tájolása

Orientation — álló (portrait) vagy fekvő (landscape) tájolás. A szélesség és magasság összehasonlításával határozható meg: ha a szélesség kisebb, mint a magasság — portrait, egyébként — landscape. Termelési kódban a tájolást az elemek függőleges és vízszintes elrendezése közötti váltáshoz használják.

Következtetés: négy fő tulajdonság — size, viewPadding, viewInsets és orientation — lefedi az adaptív tervezési feladatok 90%-át. A többi tulajdonság (textScaleFactor, platformBrightness, devicePixelRatio) specifikus forgatókönyvekhez használatos.

A MediaQuery használata adaptív elrendezésekhez

MediaQuery — az adaptív tervezés alapja a Flutter-ben. Segítségével breakpoints-ok határozhatók meg, az elrendezés a képernyő méretétől függően változik, és a margók különböző eszközökhöz igazíthatók.

Tipikus forgatókönyv: a mobilalkalmazásnak terméklistát kell megjelenítenie. Telefonon (szélesség < 600dp) — egy oszlop. Tableten (szélesség 600–900dp) — két oszlop. Asztali gépen (szélesség > 900dp) — három oszlop. A MediaQuery.of(context).size.width lehetővé teszi az oszlopok számának dinamikus kiválasztását külön képernyő nélkül minden form faktorhoz.

Második forgatókönyv: a system gesture insets figyelembevétele modern eszközökön. Dynamic Island-del rendelkező iPhone-on vagy gesture navigation-t használó Androidon a rendszermargók a képernyő egy részét foglalják el. A MediaQuery.of(context).padding minden eszköztípushoz megfelelő értékeket ad vissza, és a Scaffold ezeket automatikusan alkalmazza a body-n keresztül. Egyéni widgetek esetén a padding-ot explicit módon kell átadni a MediaQuery-ből.

Harmadik forgatókönyv: alkalmazkodás a rendszer akadálymentesítési beállításaihoz. A MediaQuery.of(context).textScaleFactor mutatja, hogy a felhasználó mennyivel növelte meg a betűméretet a beállításokban. textScaleFactor > 1.3 esetén az elrendezés elromolhat — a hosszú szövegek kilépnek a kártyák határain. Az adaptív elrendezéseknek ezt figyelembe kell venniük, és szükség esetén egyszerűbb elrendezésre kell váltaniuk.

Következtetés: MediaQuery — nem csak mérőszámok forrása, hanem eszköz a valóban adaptív felületek építéséhez. Használja breakpoints-okhoz, safe area-hoz és az akadálymentesítés figyelembevételéhez.

Kódpéldák MediaQuery-vel

1. példa a képernyőméret lekérését és a breakpoints-ok alkalmazását mutatja az oszlopok számának kiválasztásához.

dart
int getColumnCount(BuildContext context) {
  final width = MediaQuery.of(context).size.width;
  if (width > 900) return 3;
  if (width > 600) return 2;
  return 1;
}

A fenti példa egy függvényt mutat az oszlopok számának kiválasztásához a képernyő szélessége alapján. A 600 és 900 breakpoints-ok megfelelnek a Material Design általánosan elfogadott szabványainak telefonokhoz, tabletekhez és asztali gépekhez.

2. példa — a MediaQuery használata viewPadding-del a tartalom helyes elhelyezéséhez a rendszermargók figyelembevételével.

dart
Widget build(BuildContext context) {
  final padding = MediaQuery.of(context).padding;

  return Padding(
    padding: EdgeInsets.only(
      top: padding.top,
      left: padding.left,
      right: padding.right,
    ),
    child: const MyContent(),
  );
}

Ebben a példában a padding a tartalmat Padding-be csomagolja, rendszermargókat használva. A top figyelembe veszi az állapotsort és a notch-ot, a left/right — a biztonságos zónákat. A bottom nincs benne, mert a Scaffold általában maga kezeli az alsó navigációt.

3. példa — a tájolás meghatározása és az elemek elrendezésének módosítása.

dart
Widget build(BuildContext context) {
  final isPortrait = MediaQuery.of(context).orientation == Orientation.portrait;

  return isPortrait
      ? const Column(
          children: [HeaderBanner(), ContentList()],
        )
      : const Row(
          children: [HeaderBanner(), ContentList()],
        );
}

Portrait módban az elemek függőlegesen (Column), landscape-ben vízszintesen (Row) helyezkednek el. Ez a megközelítés biztosítja a legjobb helykihasználást az eszköz elforgatásakor.

Következtetés: MediaQuery — a fő eszköz adaptív elrendezések építéséhez. Flutter felületek fejlesztésekor mindig vegye figyelembe a rendszermargókat, breakpoints-okat és a tájolást.

Gyakori hibák a MediaQuery használatakor

1. hiba: MediaQuery.of(context) hívása a MediaQuery kontextusán kívül. Ha a widget a MediaQuery felett van a fában, a hívás futásidejű hibához vezet. Megoldás: mindig a MaterialApp vagy CupertinoApp által csomagolt widgeteken belül hívja a MediaQuery.of(context)-et, ahol a MediaQuery gyökér widgetként van beállítva.

2. hiba: a safe area elfelejtése. A fejlesztők a MediaQuery.size-t használják elemek elhelyezésére a rendszermargók figyelembevétele nélkül. A notch-csel vagy gesture navigation-nel rendelkező eszközökön a tartalom az állapotsor alá kerül. Megoldás: vonja ki a MediaQuery.of(context).padding-et a pozícionálási koordinátákból.

3. hiba: merev kötődés a méretekhez. A MediaQuery.of(context).size.width használata az elemek pontos méretének meghatározásához (width: size.width * 0.3) csak egy form faktorú eszközökön működik. Asztali gépen vagy tableten az elrendezés természetellenesnek tűnik. Megoldás: használjon breakpoints-okat Expanded és Flexible kombinációval a rugalmas elrendezéshez, nem merev százalékokat.

4. hiba: a textScaleFactor figyelmen kívül hagyása. Amikor a felhasználó növeli a rendszer betűméretét, a felület elromolhat — a szövegek kilépnek a konténerek határain. Megoldás: ellenőrizze a MediaQuery.of(context).textScaleFactor-t, és 1.3 feletti értékeknél váltson egyszerűbb, görgethető elrendezésre.

Következtetés: MediaQuery — hatékony, de finom eszköz. Vegye figyelembe a rendszermargókat, tájolást és akadálymentesítési beállításokat, hogy a felület minden eszközön helyesen jelenjen meg.

Gyakran Ismételt Kérdések

Mi a különbség a MediaQuery.size és a MediaQuery.viewInsets között?

MediaQuery.size — a képernyő vagy alkalmazásablak teljes mérete logikai pixelekben. MediaQuery.viewInsets — a rendszer billentyűzet által takart terület. A billentyűzet nélküli rendelkezésre álló hely kiszámításához: size.height - viewInsets.bottom.

Mikor használjunk LayoutBuilder-t MediaQuery helyett?

LayoutBuilder a szülő konténer méretét adja meg, nem az egész képernyőét. Használjon LayoutBuilder-t, ha a widget mérete egy adott szülőn belüli rendelkezésre álló helytől függ, és MediaQuery-t, ha globális képernyő mérőszámokra van szükség.

Hogyan reagál a MediaQuery a tájolás változására?

Automatikusan. Az eszköz elforgatásakor a Flutter frissíti a MediaQueryData-t és újraépíti a részgráfot. Az orientation tulajdonság megváltozik, és az összes feliratkozott widget builder-je az új adatokkal kerül meghívásra.

Megváltoztatható a MediaQuery az alkalmazás egy részére?

Igen. A widgetek egy részének MediaQuery-be csomagolásával felülírt adatokkal a MediaQuery.removePadding, MediaQuery.removeViewInsets vagy más Data-val rendelkező MediaQuery segítségével. Ez iframe-be ágyazáshoz vagy előnézeti módokhoz használatos.

Hogyan befolyásolja a MediaQuery a tesztelést?

Tesztekhez a Flutter setScreenSize-t és MediaQuery csomagolót biztosít a tesztkörnyezetben. Widget tesztekhez csomagolja a tesztelt komponenst MaterialApp-be vagy MediaQuery-be tesztadatokkal a képernyőméretek szabályozásához.

Összefoglaló

  • MediaQuery — a képernyő mérőszámainak központi forrása a Flutter-ben: méret, tájolás, margók és sűrűség
  • MediaQuery.of(context) — szabványos hozzáférési mód az adatokhoz az aktuális BuildContext-en keresztül
  • ViewPadding kötelező a safe area figyelembevételéhez notch-csel és gesture navigation-nel rendelkező eszközökön
  • Breakpoints (600, 900dp) — az adaptív tervezés alapja a MediaQuery.size.width segítségével
  • Orientation váltja az elemek elrendezését az eszköz elforgatásakor
  • textScaleFactor figyelembe veszi a rendszer akadálymentesítési beállításait a betűméret skálázásához
  • Javaslat: mindig ellenőrizze a viewPadding és viewInsets értékeket gyökér elrendezések építésekor

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is