MediaQuery Flutter میں ایک آبجیکٹ ہے جو موجودہ میڈیا ماحول کے بارے میں معلومات فراہم کرتا ہے: اسکرین سائز، ڈیوائس اورینٹیشن، پکسل کثافت، سسٹم مارجن اور فونٹ سائز۔ MediaQueryData ان تمام میٹرکس کے لیے ایک کنٹینر ہے، جو MediaQuery.of(context) کے ذریعے قابل رسائی ہے۔ سرکاری Flutter دستاویزات (2026) کے مطابق، MediaQuery موافقت پذیر ڈیزائن کی بنیاد ہے: اس کے ذریعے یہ طے کیا جاتا ہے کہ موبائل یا ٹیبلیٹ لے آؤٹ دکھانا ہے، محفوظ علاقے کے لیے مارجن کا حساب لگانا ہے اور اسکرین کے نسبت ایلیمنٹ کے سائز منتخب کرنا ہے۔
اہم نکات
MediaQuery Flutter میں ایک ویجٹ اور کلاس ہے جو ایپلیکیشن کے میڈیا ماحول کے بارے میں ڈیٹا فراہم کرتی ہے۔ MediaQuery پوری ایپلیکیشن کو روٹ MaterialApp یا CupertinoApp ویجٹ میں لپیٹ دیتا ہے، اور کوئی بھی چائلڈ ویجٹ MediaQuery.of(context) کے ذریعے اس ڈیٹا تک رسائی حاصل کر سکتا ہے۔
جب Flutter ایپلیکیشن شروع کرتا ہے، تو یہ MediaQueryData کی ایک مثال بناتا ہے جس میں موجودہ ڈیوائس کے تمام میٹرکس ہوتے ہیں۔ یہ ڈیٹا تبدیلیوں پر خود بخود اپ ڈیٹ ہوتا ہے: ڈیوائس گھمانا، ونڈو کا سائز تبدیل کرنا (ڈیسک ٹاپ پر)، کی بورڈ ظاہر ہونا یا سسٹم ایکسیسبیلٹی سیٹنگز میں تبدیلی۔ MediaQuery ڈیٹا میں کسی بھی تبدیلی پر ویجٹ سب ٹری کو دوبارہ تعمیر کرتا ہے، جو ری ایکٹیو انٹرفیس موافقت فراہم کرتا ہے۔
MediaQueryData میں شامل ہیں: size (اسکرین سائز)، devicePixelRatio (پکسل کثافت)، textScaleFactor (سسٹم سیٹنگز سے فونٹ اسکیل)، viewInsets (کی بورڈ سے ڈھکا ہوا علاقہ)، viewPadding (سسٹم مارجن)، orientation (سمت)، اور platformBrightness (ہلکا یا گہرا تھیم)۔
خلاصہ: MediaQuery Flutter میں ڈیوائس کی معلومات کا مرکزی ذریعہ ہے۔ MediaQuery.of(context) تک رسائی کسی بھی موافقت پذیر انٹرفیس کی تعمیر کا پہلا قدم ہے۔
MediaQueryData میں درجنوں خصوصیات ہیں، لیکن سب سے زیادہ استعمال ہونے والی وہ ہیں جو لے آؤٹ کی تعمیر کو متاثر کرتی ہیں۔ آئیے اہم خصوصیات دیکھتے ہیں۔
MediaQuery.of(context).size ڈیوائس سے آزاد پکسلز (dip) میں اسکرین کی چوڑائی اور اونچائی کے ساتھ ایک Size آبجیکٹ لوٹاتا ہے۔ یہ قدریں سسٹم مارجن کو مدنظر نہیں رکھتیں۔ موافقت پذیر لے آؤٹ حسابات کے لیے، size بنیادی میٹرک ہے: یہ موبائل، ٹیبلیٹ اور ڈیسک ٹاپ لے آؤٹ کے لیے بریک پوائنٹس طے کرتا ہے۔
ViewPadding وہ مارجن ہیں جو سسٹم اسٹیٹس بار، نوچ (اسکرین کٹ آؤٹ)، سسٹم نیویگیشن پینل اور ہوم انڈیکیٹر (iOS پر) کے لیے مختص کرتا ہے۔ ان مارجن کو مدنظر رکھے بغیر، مواد سسٹم ایلیمنٹس کے نیچے آ سکتا ہے۔ MediaQuery.of(context).padding ایک EdgeInsets لوٹاتا ہے جسے صفحہ کے روٹ کنٹینر پر پیڈنگ کے طور پر لگانا چاہیے۔
ViewInsets اسکرین کا وہ علاقہ ہے جو سافٹ ویئر کی بورڈ سے ڈھکا ہوتا ہے۔ ان پٹ فیلڈز کے لیے، مواد کو کی بورڈ کے اوپر اٹھانے کے لیے viewInsets.bottom کی نگرانی کرنا ضروری ہے۔ Flutter اسے اسکیفولڈ میں خود بخود ہینڈل کرتا ہے، لیکن کسٹم لے آؤٹ کے لیے آپ کو براہ راست MediaQuery.of(context).viewInsets استعمال کرنا ہوگا۔
Orientation — عمودی (portrait) یا افقی (landscape) سمت۔ یہ چوڑائی اور اونچائی کا موازنہ کرکے طے کیا جاتا ہے: اگر چوڑائی اونچائی سے کم ہے — عمودی، ورنہ — افقی۔ پروڈکشن کوڈ میں، سمت کا استعمال ایلیمنٹس کی عمودی اور افقی ترتیب کے درمیان سوئچ کرنے کے لیے کیا جاتا ہے۔
خلاصہ: چار اہم خصوصیات — size، viewPadding، viewInsets اور orientation — موافقت پذیر ڈیزائن کے 90% کاموں کو کور کرتی ہیں۔ باقی خصوصیات (textScaleFactor، platformBrightness، devicePixelRatio) مخصوص منظرناموں کے لیے استعمال ہوتی ہیں۔
MediaQuery Flutter میں موافقت پذیر ڈیزائن کی بنیاد ہے۔ اس کے ذریعے بریک پوائنٹس طے کیے جاتے ہیں، اسکرین سائز کے مطابق لے آؤٹ تبدیل کیا جاتا ہے اور مختلف ڈیوائسز کے لیے مارجن ایڈجسٹ کیے جاتے ہیں۔
عام منظرنامہ: ایک موبائل ایپ کو مصنوعات کی فہرست دکھانی ہے۔ فون پر (چوڑائی < 600dp) — ایک کالم۔ ٹیبلیٹ پر (چوڑائی 600–900dp) — دو کالم۔ ڈیسک ٹاپ پر (چوڑائی > 900dp) — تین کالم۔ MediaQuery.of(context).size.width ہر فارم فیکٹر کے لیے علیحدہ اسکرین کے بغیر کالموں کی تعداد کو متحرک طور پر منتخب کرنے کی اجازت دیتا ہے۔
دوسرا منظرنامہ: جدید ڈیوائسز پر سسٹم جیسچر انسیٹس کو مدنظر رکھنا۔ Dynamic Island والے iPhone یا جیسچر نیویگیشن والے Android پر، سسٹم مارجن اسکرین کا کچھ حصہ کھا جاتے ہیں۔ MediaQuery.of(context).padding ہر ڈیوائس کی قسم کے لیے درست قدریں لوٹاتا ہے، اور Scaffold انہیں body کے ذریعے خود بخود لاگو کرتا ہے۔ کسٹم ویجٹ کے لیے، آپ کو MediaQuery سے پیڈنگ واضح طور پر پاس کرنی ہوگی۔
تیسرا منظرنامہ: سسٹم ایکسیسبیلٹی سیٹنگز کے مطابق ڈھلنا۔ MediaQuery.of(context).textScaleFactor دکھاتا ہے کہ صارف نے سیٹنگز میں فونٹ سائز کتنا بڑھایا ہے۔ textScaleFactor > 1.3 پر، لے آؤٹ ٹوٹ سکتا ہے — لمبا متن کارڈ کی حدود سے باہر نکل جاتا ہے۔ موافقت پذیر لے آؤٹ کو اسے مدنظر رکھنا چاہیے اور اگر ضروری ہو تو آسان لے آؤٹ پر سوئچ کرنا چاہیے۔
خلاصہ: MediaQuery صرف میٹرکس کا ذریعہ نہیں ہے بلکہ حقیقی معنوں میں موافقت پذیر انٹرفیس بنانے کا ایک آلہ ہے۔ بریک پوائنٹس، محفوظ علاقے اور ایکسیسبیلٹی کے تحفظات کے لیے اسے استعمال کریں۔
مثال 1 اسکرین سائز حاصل کرنے اور کالموں کی تعداد منتخب کرنے کے لیے بریک پوائنٹس لاگو کرنے کا مظاہرہ کرتی ہے۔
int getColumnCount(BuildContext context) {
final width = MediaQuery.of(context).size.width;
if (width > 900) return 3;
if (width > 600) return 2;
return 1;
}
اوپر دی گئی مثال اسکرین کی چوڑائی کی بنیاد پر کالموں کی تعداد منتخب کرنے کا فنکشن دکھاتی ہے۔ بریک پوائنٹس 600 اور 900 فون، ٹیبلیٹ اور ڈیسک ٹاپ کے لیے عام طور پر قبول شدہ Material Design معیارات کے مطابق ہیں۔
مثال 2 — سسٹم مارجن کو مدنظر رکھتے ہوئے درست مواد کی جگہ کے لیے viewPadding کے ساتھ MediaQuery کا استعمال۔
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(),
);
}
اس مثال میں، padding سسٹم مارجن کا استعمال کرتے ہوئے مواد کو Padding میں لپیٹتا ہے۔ top اسٹیٹس بار اور نوچ کو مدنظر رکھتا ہے، left/right محفوظ علاقوں کو۔ bottom شامل نہیں ہے کیونکہ Scaffold عام طور پر نیچے کی نیویگیشن خود ہینڈل کرتا ہے۔
مثال 3 — سمت کا تعین اور ایلیمنٹ کی ترتیب تبدیل کرنا۔
Widget build(BuildContext context) {
final isPortrait = MediaQuery.of(context).orientation == Orientation.portrait;
return isPortrait
? const Column(
children: [HeaderBanner(), ContentList()],
)
: const Row(
children: [HeaderBanner(), ContentList()],
);
}
عمودی موڈ میں، ایلیمنٹ عمودی طور پر (Column) ترتیب دیے جاتے ہیں؛ افقی موڈ میں، افقی طور پر (Row)۔ یہ طریقہ ڈیوائس گھمانے پر جگہ کا بہترین استعمال دیتا ہے۔
خلاصہ: MediaQuery موافقت پذیر لے آؤٹ بنانے کا اہم آلہ ہے۔ Flutter انٹرفیس تیار کرتے وقت ہمیشہ سسٹم مارجن، بریک پوائنٹس اور سمت کو مدنظر رکھیں۔
غلطی 1: MediaQuery.of(context) کو ایسے سیاق و سباق میں کال کرنا جہاں MediaQuery سیٹ نہ ہو۔ اگر کوئی ویجٹ درخت میں MediaQuery سے اوپر ہے تو کال رن ٹائم ایرر کا سبب بنتی ہے۔ حل: ہمیشہ MaterialApp یا CupertinoApp میں لپٹے ویجٹ کے اندر MediaQuery.of(context) کال کریں، جہاں MediaQuery روٹ ویجٹ کے طور پر سیٹ ہو۔
غلطی 2: محفوظ علاقہ بھولنا۔ ڈویلپر سسٹم مارجن کو مدنظر رکھے بغیر ایلیمنٹ کی پوزیشننگ کے لیے MediaQuery.size استعمال کرتے ہیں۔ نوچ یا جیسچر نیویگیشن والے ڈیوائسز پر، مواد اسٹیٹس بار کے نیچے آ جاتا ہے۔ حل: پوزیشننگ کوآرڈینیٹس سے MediaQuery.of(context).padding منہا کریں۔
غلطی 3: سائز سے سخت وابستگی۔ ایلیمنٹ کے صحیح سائز سیٹ کرنے کے لیے MediaQuery.of(context).size.width کا استعمال (width: size.width * 0.3) صرف ایک ہی فارم فیکٹر والے ڈیوائسز پر کام کرتا ہے۔ ڈیسک ٹاپ یا ٹیبلیٹ پر، لے آؤٹ غیر فطری لگتا ہے۔ حل: سخت فیصد کے بجائے لچکدار لے آؤٹ کے لیے Expanded اور Flexible کے ساتھ بریک پوائنٹس استعمال کریں۔
غلطی 4: textScaleFactor کو نظر انداز کرنا۔ جب صارف سسٹم فونٹ بڑھاتا ہے تو انٹرفیس ٹوٹ سکتا ہے — متن کنٹینر کی حدود سے باہر نکل جاتا ہے۔ حل: MediaQuery.of(context).textScaleFactor چیک کریں اور 1.3 سے اوپر کی قدروں پر اسکرولنگ کے ساتھ آسان لے آؤٹ پر سوئچ کریں۔
خلاصہ: MediaQuery ایک طاقتور لیکن نازک آلہ ہے۔ اس بات کو یقینی بنانے کے لیے کہ انٹرفیس تمام ڈیوائسز پر درست نظر آئے، سسٹم مارجن، سمت اور ایکسیسبیلٹی سیٹنگز کو مدنظر رکھیں۔
اکثر پوچھے گئے سوالات
MediaQuery.size منطقی پکسلز میں اسکرین یا ایپلیکیشن ونڈو کا کل سائز ہے۔ MediaQuery.viewInsets سسٹم کی بورڈ سے ڈھکا ہوا علاقہ ہے۔ کی بورڈ کے بغیر دستیاب جگہ کا حساب لگانے کے لیے: size.height - viewInsets.bottom۔
LayoutBuilder پورینٹ کنٹینر کے طول و عرض دیتا ہے، پوری اسکرین کے نہیں۔ LayoutBuilder استعمال کریں جب ویجٹ کے سائز کسی مخصوص پورینٹ کے اندر دستیاب جگہ پر منحصر ہوں، اور MediaQuery استعمال کریں جب عالمی اسکرین میٹرکس کی ضرورت ہو۔
خود بخود۔ ڈیوائس گھمانے پر، Flutter MediaQueryData کو اپ ڈیٹ کرتا ہے اور سب ٹری کو دوبارہ تعمیر کرتا ہے۔ orientation خصوصیت بدل جاتی ہے اور تمام سبسکرائب کردہ ویجٹ کے بلڈر کو نئے ڈیٹا کے ساتھ کال کیا جاتا ہے۔
ہاں۔ MediaQuery.removePadding، MediaQuery.removeViewInsets یا مختلف Data کے ساتھ MediaQuery کے ذریعے اوور رائیڈ کردہ ڈیٹا کے ساتھ ویجٹ کے حصے کو MediaQuery میں لپیٹ کر۔ یہ iframe یا پیش نظارہ موڈز میں ایمبیڈ کرنے کے لیے استعمال ہوتا ہے۔
ٹیسٹنگ کے لیے، Flutter ٹیسٹ ماحول میں setScreenSize اور MediaQuery ریپر فراہم کرتا ہے۔ ویجٹ ٹیسٹ کے لیے، اسکرین کے طول و عرض کو کنٹرول کرنے کے لیے ٹیسٹ کے تحت کمپوننٹ کو MaterialApp یا ٹیسٹ ڈیٹا والے MediaQuery میں لپیٹیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں