| // 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' show lerpDouble; |
| |
| import 'package:flutter/foundation.dart'; |
| import 'package:flutter/rendering.dart'; |
| |
| /// Defines default property values for [BottomSheet]'s [Material]. |
| /// |
| /// Descendant widgets obtain the current [BottomSheetThemeData] object |
| /// using `Theme.of(context).bottomSheetTheme`. Instances of |
| /// [BottomSheetThemeData] can be customized with |
| /// [BottomSheetThemeData.copyWith]. |
| /// |
| /// Typically a [BottomSheetThemeData] is specified as part of the |
| /// overall [Theme] with [ThemeData.bottomSheetTheme]. |
| /// |
| /// All [BottomSheetThemeData] properties are `null` by default. |
| /// When null, the [BottomSheet] will provide its own defaults. |
| /// |
| /// See also: |
| /// |
| /// * [ThemeData], which describes the overall theme information for the |
| /// application. |
| @immutable |
| class BottomSheetThemeData with Diagnosticable { |
| /// Creates a theme that can be used for [ThemeData.bottomSheetTheme]. |
| const BottomSheetThemeData({ |
| this.backgroundColor, |
| this.surfaceTintColor, |
| this.elevation, |
| this.modalBackgroundColor, |
| this.modalBarrierColor, |
| this.shadowColor, |
| this.modalElevation, |
| this.shape, |
| this.showDragHandle, |
| this.dragHandleColor, |
| this.dragHandleSize, |
| this.clipBehavior, |
| this.constraints, |
| }); |
| |
| /// Overrides the default value for [BottomSheet.backgroundColor]. |
| /// |
| /// If null, [BottomSheet] defaults to [Material]'s default. |
| final Color? backgroundColor; |
| |
| /// Overrides the default value for surfaceTintColor. |
| /// |
| /// If null, [BottomSheet] will not display an overlay color. |
| /// |
| /// See [Material.surfaceTintColor] for more details. |
| final Color? surfaceTintColor; |
| |
| /// Overrides the default value for [BottomSheet.elevation]. |
| /// |
| /// {@macro flutter.material.material.elevation} |
| /// |
| /// If null, [BottomSheet] defaults to 0.0. |
| final double? elevation; |
| |
| /// Value for [BottomSheet.backgroundColor] when the Bottom sheet is presented |
| /// as a modal bottom sheet. |
| final Color? modalBackgroundColor; |
| |
| /// Overrides the default value for barrier color when the Bottom sheet is presented as |
| /// a modal bottom sheet. |
| final Color? modalBarrierColor; |
| |
| /// Overrides the default value for [BottomSheet.shadowColor]. |
| final Color? shadowColor; |
| |
| /// Value for [BottomSheet.elevation] when the Bottom sheet is presented as a |
| /// modal bottom sheet. |
| final double? modalElevation; |
| |
| /// Overrides the default value for [BottomSheet.shape]. |
| /// |
| /// If null, no overriding shape is specified for [BottomSheet], so the |
| /// [BottomSheet] is rectangular. |
| final ShapeBorder? shape; |
| |
| /// Overrides the default value for [BottomSheet.showDragHandle]. |
| final bool? showDragHandle; |
| |
| /// Overrides the default value for [BottomSheet.dragHandleColor]. |
| final Color? dragHandleColor; |
| |
| /// Overrides the default value for [BottomSheet.dragHandleSize]. |
| final Size? dragHandleSize; |
| |
| /// Overrides the default value for [BottomSheet.clipBehavior]. |
| /// |
| /// If null, [BottomSheet] uses [Clip.none]. |
| final Clip? clipBehavior; |
| |
| /// Constrains the size of the [BottomSheet]. |
| /// |
| /// If null, the bottom sheet's size will be unconstrained. |
| final BoxConstraints? constraints; |
| |
| /// Creates a copy of this object with the given fields replaced with the |
| /// new values. |
| BottomSheetThemeData copyWith({ |
| Color? backgroundColor, |
| Color? surfaceTintColor, |
| double? elevation, |
| Color? modalBackgroundColor, |
| Color? modalBarrierColor, |
| Color? shadowColor, |
| double? modalElevation, |
| ShapeBorder? shape, |
| bool? showDragHandle, |
| Color? dragHandleColor, |
| Size? dragHandleSize, |
| Clip? clipBehavior, |
| BoxConstraints? constraints, |
| }) { |
| return BottomSheetThemeData( |
| backgroundColor: backgroundColor ?? this.backgroundColor, |
| surfaceTintColor: surfaceTintColor ?? this.surfaceTintColor, |
| elevation: elevation ?? this.elevation, |
| modalBackgroundColor: modalBackgroundColor ?? this.modalBackgroundColor, |
| modalBarrierColor: modalBarrierColor ?? this.modalBarrierColor, |
| shadowColor: shadowColor ?? this.shadowColor, |
| modalElevation: modalElevation ?? this.modalElevation, |
| shape: shape ?? this.shape, |
| showDragHandle: showDragHandle ?? this.showDragHandle, |
| dragHandleColor: dragHandleColor ?? this.dragHandleColor, |
| dragHandleSize: dragHandleSize ?? this.dragHandleSize, |
| clipBehavior: clipBehavior ?? this.clipBehavior, |
| constraints: constraints ?? this.constraints, |
| ); |
| } |
| |
| /// Linearly interpolate between two bottom sheet themes. |
| /// |
| /// If both arguments are null then null is returned. |
| /// |
| /// {@macro dart.ui.shadow.lerp} |
| static BottomSheetThemeData? lerp(BottomSheetThemeData? a, BottomSheetThemeData? b, double t) { |
| if (identical(a, b)) { |
| return a; |
| } |
| return BottomSheetThemeData( |
| backgroundColor: Color.lerp(a?.backgroundColor, b?.backgroundColor, t), |
| surfaceTintColor: Color.lerp(a?.surfaceTintColor, b?.surfaceTintColor, t), |
| elevation: lerpDouble(a?.elevation, b?.elevation, t), |
| modalBackgroundColor: Color.lerp(a?.modalBackgroundColor, b?.modalBackgroundColor, t), |
| modalBarrierColor: Color.lerp(a?.modalBarrierColor, b?.modalBarrierColor, t), |
| shadowColor: Color.lerp(a?.shadowColor, b?.shadowColor, t), |
| modalElevation: lerpDouble(a?.modalElevation, b?.modalElevation, t), |
| shape: ShapeBorder.lerp(a?.shape, b?.shape, t), |
| showDragHandle: t < 0.5 ? a?.showDragHandle : b?.showDragHandle, |
| dragHandleColor: Color.lerp(a?.dragHandleColor, b?.dragHandleColor, t), |
| dragHandleSize: Size.lerp(a?.dragHandleSize, b?.dragHandleSize, t), |
| clipBehavior: t < 0.5 ? a?.clipBehavior : b?.clipBehavior, |
| constraints: BoxConstraints.lerp(a?.constraints, b?.constraints, t), |
| ); |
| } |
| |
| @override |
| int get hashCode => Object.hash( |
| backgroundColor, |
| surfaceTintColor, |
| elevation, |
| modalBackgroundColor, |
| modalBarrierColor, |
| shadowColor, |
| modalElevation, |
| shape, |
| showDragHandle, |
| dragHandleColor, |
| dragHandleSize, |
| clipBehavior, |
| constraints, |
| ); |
| |
| @override |
| bool operator ==(Object other) { |
| if (identical(this, other)) { |
| return true; |
| } |
| if (other.runtimeType != runtimeType) { |
| return false; |
| } |
| return other is BottomSheetThemeData |
| && other.backgroundColor == backgroundColor |
| && other.surfaceTintColor == surfaceTintColor |
| && other.elevation == elevation |
| && other.modalBackgroundColor == modalBackgroundColor |
| && other.shadowColor == shadowColor |
| && other.modalBarrierColor == modalBarrierColor |
| && other.modalElevation == modalElevation |
| && other.shape == shape |
| && other.showDragHandle == showDragHandle |
| && other.dragHandleColor == dragHandleColor |
| && other.dragHandleSize == dragHandleSize |
| && other.clipBehavior == clipBehavior |
| && other.constraints == constraints; |
| } |
| |
| @override |
| void debugFillProperties(DiagnosticPropertiesBuilder properties) { |
| super.debugFillProperties(properties); |
| properties.add(ColorProperty('backgroundColor', backgroundColor, defaultValue: null)); |
| properties.add(ColorProperty('surfaceTintColor', surfaceTintColor, defaultValue: null)); |
| properties.add(DoubleProperty('elevation', elevation, defaultValue: null)); |
| properties.add(ColorProperty('modalBackgroundColor', modalBackgroundColor, defaultValue: null)); |
| properties.add(ColorProperty('shadowColor', shadowColor, defaultValue: null)); |
| properties.add(ColorProperty('modalBarrierColor', modalBarrierColor, defaultValue: null)); |
| properties.add(DoubleProperty('modalElevation', modalElevation, defaultValue: null)); |
| properties.add(DiagnosticsProperty<ShapeBorder>('shape', shape, defaultValue: null)); |
| properties.add(DiagnosticsProperty<bool>('showDragHandle', showDragHandle, defaultValue: null)); |
| properties.add(ColorProperty('dragHandleColor', dragHandleColor, defaultValue: null)); |
| properties.add(DiagnosticsProperty<Size>('dragHandleSize', dragHandleSize, defaultValue: null)); |
| properties.add(DiagnosticsProperty<Clip>('clipBehavior', clipBehavior, defaultValue: null)); |
| properties.add(DiagnosticsProperty<BoxConstraints>('constraints', constraints, defaultValue: null)); |
| } |
| } |