// 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/widgets.dart'; import 'theme.dart'; /// Defines a theme for [Dialog] widgets. /// /// Descendant widgets obtain the current [DialogTheme] object using /// `DialogTheme.of(context)`. Instances of [DialogTheme] can be customized with /// [DialogTheme.copyWith]. /// /// [titleTextStyle] and [contentTextStyle] are used in [AlertDialog]s and [SimpleDialog]s. /// /// See also: /// /// * [Dialog], a dialog that can be customized using this [DialogTheme]. /// * [AlertDialog], a dialog that can be customized using this [DialogTheme]. /// * [SimpleDialog], a dialog that can be customized using this [DialogTheme]. /// * [ThemeData], which describes the overall theme information for the /// application. @immutable class DialogTheme with Diagnosticable { /// Creates a dialog theme that can be used for [ThemeData.dialogTheme]. const DialogTheme({ this.backgroundColor, this.elevation, this.shadowColor, this.surfaceTintColor, this.shape, this.alignment, this.iconColor, this.titleTextStyle, this.contentTextStyle, this.actionsPadding, }); /// Overrides the default value for [Dialog.backgroundColor]. final Color? backgroundColor; /// Overrides the default value for [Dialog.elevation]. final double? elevation; /// Overrides the default value for [Dialog.shadowColor]. final Color? shadowColor; /// Overrides the default value for [Dialog.surfaceTintColor]. final Color? surfaceTintColor; /// Overrides the default value for [Dialog.shape]. final ShapeBorder? shape; /// Overrides the default value for [Dialog.alignment]. final AlignmentGeometry? alignment; /// Overrides the default value for [DefaultTextStyle] for [SimpleDialog.title] and /// [AlertDialog.title]. final TextStyle? titleTextStyle; /// Overrides the default value for [DefaultTextStyle] for [SimpleDialog.children] and /// [AlertDialog.content]. final TextStyle? contentTextStyle; /// Overrides the default value for [AlertDialog.actionsPadding]. final EdgeInsetsGeometry? actionsPadding; /// Used to configure the [IconTheme] for the [AlertDialog.icon] widget. final Color? iconColor; /// Creates a copy of this object but with the given fields replaced with the /// new values. DialogTheme copyWith({ Color? backgroundColor, double? elevation, Color? shadowColor, Color? surfaceTintColor, ShapeBorder? shape, AlignmentGeometry? alignment, Color? iconColor, TextStyle? titleTextStyle, TextStyle? contentTextStyle, EdgeInsetsGeometry? actionsPadding, }) { return DialogTheme( backgroundColor: backgroundColor ?? this.backgroundColor, elevation: elevation ?? this.elevation, shadowColor: shadowColor ?? this.shadowColor, surfaceTintColor: surfaceTintColor ?? this.surfaceTintColor, shape: shape ?? this.shape, alignment: alignment ?? this.alignment, iconColor: iconColor ?? this.iconColor, titleTextStyle: titleTextStyle ?? this.titleTextStyle, contentTextStyle: contentTextStyle ?? this.contentTextStyle, actionsPadding: actionsPadding ?? this.actionsPadding, ); } /// The data from the closest [DialogTheme] instance given the build context. static DialogTheme of(BuildContext context) { return Theme.of(context).dialogTheme; } /// Linearly interpolate between two dialog themes. /// /// The arguments must not be null. /// /// {@macro dart.ui.shadow.lerp} static DialogTheme lerp(DialogTheme? a, DialogTheme? b, double t) { assert(t != null); return DialogTheme( backgroundColor: Color.lerp(a?.backgroundColor, b?.backgroundColor, t), elevation: lerpDouble(a?.elevation, b?.elevation, t), shadowColor: Color.lerp(a?.shadowColor, b?.shadowColor, t), surfaceTintColor: Color.lerp(a?.surfaceTintColor, b?.surfaceTintColor, t), shape: ShapeBorder.lerp(a?.shape, b?.shape, t), alignment: AlignmentGeometry.lerp(a?.alignment, b?.alignment, t), iconColor: Color.lerp(a?.iconColor, b?.iconColor, t), titleTextStyle: TextStyle.lerp(a?.titleTextStyle, b?.titleTextStyle, t), contentTextStyle: TextStyle.lerp(a?.contentTextStyle, b?.contentTextStyle, t), actionsPadding: EdgeInsetsGeometry.lerp(a?.actionsPadding, b?.actionsPadding, t), ); } @override int get hashCode => shape.hashCode; @override bool operator ==(Object other) { if (identical(this, other)) { return true; } if (other.runtimeType != runtimeType) { return false; } return other is DialogTheme && other.backgroundColor == backgroundColor && other.elevation == elevation && other.shadowColor == shadowColor && other.surfaceTintColor == surfaceTintColor && other.shape == shape && other.alignment == alignment && other.iconColor == iconColor && other.titleTextStyle == titleTextStyle && other.contentTextStyle == contentTextStyle && other.actionsPadding == actionsPadding; } @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties.add(ColorProperty('backgroundColor', backgroundColor)); properties.add(DoubleProperty('elevation', elevation)); properties.add(ColorProperty('shadowColor', shadowColor)); properties.add(ColorProperty('surfaceTintColor', surfaceTintColor)); properties.add(DiagnosticsProperty<ShapeBorder>('shape', shape, defaultValue: null)); properties.add(DiagnosticsProperty<AlignmentGeometry>('alignment', alignment, defaultValue: null)); properties.add(ColorProperty('iconColor', iconColor)); properties.add(DiagnosticsProperty<TextStyle>('titleTextStyle', titleTextStyle, defaultValue: null)); properties.add(DiagnosticsProperty<TextStyle>('contentTextStyle', contentTextStyle, defaultValue: null)); properties.add(DiagnosticsProperty<EdgeInsetsGeometry>('actionsPadding', actionsPadding, defaultValue: null)); } }