measureAutoFitLayouts function

Future<List<Size>> measureAutoFitLayouts(
  1. BuildContext context,
  2. List<SwayzeAutoFitMeasurementRequest> requests
)

Implementation

Future<List<Size>> measureAutoFitLayouts(BuildContext context, List<SwayzeAutoFitMeasurementRequest> requests) async {
  if (requests.isEmpty) {
    return const [];
  }

  final overlay = Overlay.maybeOf(context, rootOverlay: true);
  if (overlay == null) {
    return List<Size>.filled(requests.length, Size.zero);
  }

  final keys = List.generate(requests.length, (_) => GlobalKey());
  final textDirection = Directionality.of(context);
  final mediaQuery = MediaQuery.maybeOf(context);

  late final OverlayEntry overlayEntry;
  overlayEntry = OverlayEntry(
    builder: (_) {
      Widget child = _SwayzeAutoFitMeasurementHost(requests: requests, keys: keys);
      child = Directionality(textDirection: textDirection, child: child);

      if (mediaQuery != null) {
        child = MediaQuery(data: mediaQuery, child: child);
      }

      return IgnorePointer(child: InheritedTheme.captureAll(context, child));
    },
  );

  overlay.insert(overlayEntry);
  await WidgetsBinding.instance.endOfFrame;

  final sizes = [for (final key in keys) ((key.currentContext?.findRenderObject()) as RenderBox?)?.size ?? Size.zero];

  overlayEntry.remove();

  return sizes;
}