تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۰ راضیه کارگر
تناسب اندازه متن‌ها در دیوایس‌های مختلف
جامعه فلاتر ایجاد شده در ۲۰ اردیبهشت ۱۴۰۱

شاید برای شما هم پیش امده باشد که هنگام اجرای یک برنامه روی شبیه ساز و گوشی واقعی موبایل متوجه تفاوت اندازه فونت‌ها شده باشید. مثلا سایز روی گوشی بسیار بزرگتر از شبیه ساز نمایش داده میشود.

به عنوان مثال در شبیه ساز با این اندازه‌ها دیده میشود.

1af4-image.png

ولی در گوشی با این اندازه

10e5-image.png

برای متناسب بودن در تمام گوشی‌ها راهکار چیست؟

کافی است در فایل main.dart یک متغیر سراسری با نام textScale ایجاد کنید.

double textScale = 1.0;

سپس در کلاس MyApp این متغیر را با توجه به textScaleFactorOf مربوط به MediaQuery مجددا تنظیم کنید.

textScale = 1/ MediaQuery.textScaleFactorOf(context).toDouble();

سپس هر کجا از عدد ثابتی برای fontSize استفاده میکنید ، مقدار textScale را در آن ضرب نمایید. به عنوان مثال در تم:

bodyText2: Constant.defaultStyle2.copyWith(
     fontSize: 20 * textScale,
     fontWeight: FontWeight.w400,
),
 subtitle1: Constant.defaultStyle2.copyWith(
     fontSize: 18 * textScale,
     fontWeight: FontWeight.w400,
 ),

حال باید یک کلاس به نام Config ایجاد کنید. و سازنده MyApp را در آن فراخوانی نمایید.

class Config extends StatelessWidget {
  const Config({Key? key}) : super(key: key);
   // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(home: MyApp());
  }
}

در متد main سازنده این کلاس را فراخوانی کنید.

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

حال با اجرای مجدد مشاهده میکنید که برنامه به درستی در گوشی هم نمایش داده میشود.

4160-image.png

پس به طور کلی کد‌ها به صورت زیر خواهند بود.

double textScale = 1.0;
void main() {
  runApp(const Config());
}
class Config extends StatelessWidget {
  const Config({Key? key}) : super(key: key);
   // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(home: MyApp());
  }
}
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
 
  @override
  Widget build(BuildContext context) {
    textScale = 1 / MediaQuery.textScaleFactorOf(context).toDouble();
    return MaterialApp(
      title: 'Medic',
      theme: ThemeData(
          fontFamily: Constant.defaultStyle2.fontFamily,
          colorScheme: const ColorScheme.dark(
            ...
          ),
          textTheme: TextTheme(
            headline3: Constant.defaultStyle1.copyWith(
              fontSize: 35 * textScale,
              fontWeight: FontWeight.w500,
              color: Colors.white,
            ), ...));
}

البته راه حل‌های دیگری نیز وجود دارد. همچون استفاده از عرض صفحه نمایش و تنظیم فونت با استفاده از آن.

چنانچه راه حل بهتری وجود دارد لطفا در ادامه این تاپیک بیان نمایید.

سپاسگزارم