Files
sf-app-platform/packages/utils/lib/src/size_utils.dart

95 lines
3.2 KiB
Dart
Executable File

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
// class MainConstants {
// static const double minWebAppRatio = 9.0 / 21.0;
// static const double maxWebAppRatio = 9.0 / 18.0;
// }
/// Utils for dynamic sizes
class SizeUtils {
static double height = 0.0;
static double width = 0.0;
static double physicalHeight = 0.0;
static double physicalWidth = 0.0;
// Real value of aspect ratio height obtained through the display itself and not from calculating using the height and width
static double aspectRatioWidth = 9;
static double devicePixelRatio = 0.0;
static double physicalAspectRatioHeight = 0;
static double visibleAspectRatioHeight = 0;
// Padding of the screen where we cannot render elements without the SafeArea
static EdgeInsets padding = const EdgeInsets.all(0);
// static const double kWebDesiredAspectRatio = MainConstants.minWebAppRatio;
const SizeUtils();
/// init method which instantiates the class using MediaQuery. If a size is provided, it will use that size instead of the MediaQuery
static void init({required BuildContext context, Size? size}) {
if (size != null) {
padding = EdgeInsets.zero;
devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
height = size.height;
width = size.width;
visibleAspectRatioHeight = (height / width) * aspectRatioWidth;
physicalWidth = width;
physicalHeight = height;
physicalAspectRatioHeight =
(physicalHeight / physicalWidth) * aspectRatioWidth;
} else {
height = MediaQuery.sizeOf(context).height;
width = MediaQuery.sizeOf(context).width;
padding = MediaQuery.of(context).padding;
devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
visibleAspectRatioHeight = (height / width) * aspectRatioWidth;
final FlutterView view =
WidgetsBinding.instance.platformDispatcher.views.first;
final Size realSize = view.display.size;
// Dimensions in physical pixels (px)
physicalWidth = realSize.width / devicePixelRatio;
physicalHeight = realSize.height / devicePixelRatio;
physicalAspectRatioHeight =
(physicalHeight / physicalWidth) * aspectRatioWidth;
}
}
/// Calculate percentatge of screen height, for example: '5' would be a '5%' of the total screen size
static double heightByPercent(double percent) => height * (percent / 100);
static double physicalHeightByPercent(double percent) =>
physicalHeight * (percent / 100);
static double widthByPercent(double percent) => width * (percent / 100);
static bool get isSmallerScreen => visibleAspectRatioHeight <= 16;
static bool get isMediumScreen => physicalAspectRatioHeight <= 18.0;
static bool get isBigScreen => physicalAspectRatioHeight <= 20.0;
static bool get isXLScreen => physicalAspectRatioHeight >= 21.5;
static Size get screenSize => Size(width, height);
static T getByScreen<T>({
required T small,
T? medium,
required T big,
T? xl,
}) {
if (isSmallerScreen) return small;
if (isMediumScreen) return medium ?? small;
if (isBigScreen) return big;
if (isXLScreen) return xl ?? big;
return big;
}
static double getDefaultTopBarHeight() {
return getByScreen(small: 40.0, big: 55.0);
}
}