Flutter: адаптивные шрифты и размеры

С размерами блоков воFlutter относительно всё в порядке — очень помогает виджет Expanded. Некоторое же неудобство разработки как оказалось — это отсутствие в «из коробки» возможности указывать размер шрифтов в «адаптиве» под разные разрешения экрана.

Что делать? Решений множество. Ниже некоторые варианты:

Вариант 1:

Создать отдельный класс-обертку, через которую пропускать потом все размеры шрифтов:

class ScaleSize {
  static double textScaleFactor(BuildContext context, {double maxTextScaleFactor = 2}) {
    final width = MediaQuery.of(context).size.width;
    double val = (width / 1400) * maxTextScaleFactor;
    return max(1, min(val, maxTextScaleFactor));
  }
}

Text(
     intro.subtitle,
     style: Theme.of(context).textTheme.subtitle1,
     textAlign: TextAlign.center,
     textScaleFactor: ScaleSize.textScaleFactor(context),
   ),

Вариант 2:

Использовать различную отрисовку виджетов в зависимости от размера экранов. Как-то типа:

Widget build(BuildContext context) {

  final isSmall = MediaQuery.of(context).size.width < 500;

  return Provider.value(

    value: isSmall

        ? AdaptativeTheme(

            smallFontSize: 10,

            bigSpace: 20,

            smallSpace: 10,

          )

        : AdaptativeTheme(

            smallFontSize: 20,

            bigSpace: 40,

            smallSpace: 12,

          ),

    child: Child(),

  );

}

Вариант 3:

Использовать один из множества пакетов. Например Sizer. Тогда вся адаптация сведется к обёртыванию корневого виджета через виджет Sizer, и далее указание во всех нижележащих виджетах относительных размеров. Например так:

   return Sizer(
        builder: (context, orientation, deviceType) {
        return
          Scaffold(
...
...
                          child: Container(
                            width: 48.sp,
                            height: 48.sp,
...
...
child: Text(ListEZS[index]["nameazs"],style: TextStyle(fontSize: 14.0.sp, color: Colors.black)),