blob: aa7e4aad8eb6949c3e1668792c642bf5ef4545a9 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:ui';
import 'box.dart';
/// Signature for a function that takes a [RenderBox] and returns the [Size]
/// that the [RenderBox] would have if it were laid out with the given
/// [BoxConstraints].
///
/// [ChildLayoutHelper.dryLayoutChild] and [ChildLayoutHelper.layoutChild] adhere
/// to this signature.
typedef ChildLayouter = Size Function(RenderBox child, BoxConstraints constraints);
/// Signature for a function that takes a [RenderBox] and returns the baseline
/// offset this [RenderBox] would have if it were laid out with the given
/// [BoxConstraints].
///
/// [ChildLayoutHelper.getDryBaseline] and [ChildLayoutHelper.getBaseline] adhere
/// to this signature.
typedef ChildBaselineGetter =
double? Function(RenderBox child, BoxConstraints constraints, TextBaseline baseline);
/// A collection of static functions to layout a [RenderBox] child with the
/// given set of [BoxConstraints].
///
/// All of the functions adhere to the [ChildLayouter] signature.
abstract final class ChildLayoutHelper {
/// Returns the [Size] that the [RenderBox] would have if it were to
/// be laid out with the given [BoxConstraints].
///
/// This method calls [RenderBox.getDryLayout] on the given [RenderBox].
///
/// This method should only be called by the parent of the provided
/// [RenderBox] child as it binds parent and child together (if the child
/// is marked as dirty, the child will also be marked as dirty).
///
/// See also:
///
/// * [layoutChild], which actually lays out the child with the given
/// constraints.
static Size dryLayoutChild(RenderBox child, BoxConstraints constraints) {
return child.getDryLayout(constraints);
}
/// Lays out the [RenderBox] with the given constraints and returns its
/// [Size].
///
/// This method calls [RenderBox.layout] on the given [RenderBox] with
/// `parentUsesSize` set to true to receive its [Size].
///
/// This method should only be called by the parent of the provided
/// [RenderBox] child as it binds parent and child together (if the child
/// is marked as dirty, the child will also be marked as dirty).
///
/// See also:
///
/// * [dryLayoutChild], which does not perform a real layout of the child.
static Size layoutChild(RenderBox child, BoxConstraints constraints) {
child.layout(constraints, parentUsesSize: true);
return child.size;
}
/// Convenience function that calls [RenderBox.getDryBaseline].
static double? getDryBaseline(
RenderBox child,
BoxConstraints constraints,
TextBaseline baseline,
) {
return child.getDryBaseline(constraints, baseline);
}
/// Convenience function that calls [RenderBox.getDistanceToBaseline].
///
/// The given `child` must be already laid out with `constraints`.
static double? getBaseline(RenderBox child, BoxConstraints constraints, TextBaseline baseline) {
assert(!child.debugNeedsLayout);
assert(child.constraints == constraints);
return child.getDistanceToBaseline(baseline, onlyReal: true);
}
}