orientation_builder.dart 2.24 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
// @dart = 2.8

7 8 9 10 11 12
import 'basic.dart';
import 'framework.dart';
import 'layout_builder.dart';
import 'media_query.dart';

/// Signature for a function that builds a widget given an [Orientation].
13 14
///
/// Used by [OrientationBuilder.builder].
15
typedef OrientationWidgetBuilder = Widget Function(BuildContext context, Orientation orientation);
16

17 18
/// Builds a widget tree that can depend on the parent widget's orientation
/// (distinct from the device orientation).
19 20 21
///
/// See also:
///
22 23 24 25 26
///  * [LayoutBuilder], which exposes the complete constraints, not just the
///    orientation.
///  * [CustomSingleChildLayout], which positions its child during layout.
///  * [CustomMultiChildLayout], with which you can define the precise layout
///    of a list of children during the layout phase.
27 28
///  * [MediaQueryData.orientation], which exposes whether the device is in
///    landscape or portrait mode.
29 30 31 32
class OrientationBuilder extends StatelessWidget {
  /// Creates an orientation builder.
  ///
  /// The [builder] argument must not be null.
33
  const OrientationBuilder({
34
    Key key,
35
    @required this.builder,
36 37
  }) : assert(builder != null),
       super(key: key);
38 39

  /// Builds the widgets below this widget given this widget's orientation.
40 41 42 43 44
  ///
  /// A widget's orientation is simply a factor of its width relative to its
  /// height. For example, a [Column] widget will have a landscape orientation
  /// if its width exceeds its height, even though it displays its children in
  /// a vertical array.
45 46 47 48 49
  final OrientationWidgetBuilder builder;

  Widget _buildWithConstraints(BuildContext context, BoxConstraints constraints) {
    // If the constraints are fully unbounded (i.e., maxWidth and maxHeight are
    // both infinite), we prefer Orientation.portrait because its more common to
Josh Soref's avatar
Josh Soref committed
50
    // scroll vertically then horizontally.
51 52 53 54 55 56
    final Orientation orientation = constraints.maxWidth > constraints.maxHeight ? Orientation.landscape : Orientation.portrait;
    return builder(context, orientation);
  }

  @override
  Widget build(BuildContext context) {
57
    return LayoutBuilder(builder: _buildWithConstraints);
58 59
  }
}