blob: 2d3e13441a19fbcbb4dc86f2ad112c19aa24ae3f [file] [log] [blame]
// Copyright 2018 The Chromium 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].
/// When Shape is `null`, the dialog defaults to a [RoundedRectangleBorder] with
/// a border radius of 2.0 on all corners.
/// [titleTextStyle] and [contentTextStyle] are used in [AlertDialogs].
/// If null, they default to [ThemeData.textTheme.title] and [ThemeData.textTheme.subhead],
/// respectively.
/// See also:
/// * [Dialog], a material dialog that can be customized using this [DialogTheme].
/// * [ThemeData], which describes the overall theme information for the
/// application.
class DialogTheme extends Diagnosticable {
/// Creates a dialog theme that can be used for [ThemeData.dialogTheme].
const DialogTheme({
/// Default value for [Dialog.backgroundColor].
/// If null, [ThemeData.dialogBackgroundColor] is used, if that's null,
/// defaults to [Colors.white].
final Color backgroundColor;
/// Default value for [Dialog.elevation].
/// If null, the [Dialog] elevation defaults to `24.0`.
final double elevation;
/// Default value for [Dialog.shape].
final ShapeBorder shape;
/// Used to configure the [DefaultTextStyle] for the [AlertDialog.title] widget.
/// If null, defaults to [ThemeData.textTheme.title].
final TextStyle titleTextStyle;
/// Used to configure the [DefaultTextStyle] for the [AlertDialog.content] widget.
/// If null, defaults to [ThemeData.textTheme.subhead].
final TextStyle contentTextStyle;
/// Creates a copy of this object but with the given fields replaced with the
/// new values.
DialogTheme copyWith({
Color backgroundColor,
double elevation,
ShapeBorder shape,
TextStyle titleTextStyle,
TextStyle contentTextStyle,
}) {
return DialogTheme(
backgroundColor: backgroundColor ?? this.backgroundColor,
elevation: elevation ?? this.elevation,
shape: shape ?? this.shape,
titleTextStyle: titleTextStyle ?? this.titleTextStyle,
contentTextStyle: contentTextStyle ?? this.contentTextStyle,
/// 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),
shape: ShapeBorder.lerp(a?.shape, b?.shape, t),
titleTextStyle: TextStyle.lerp(a?.titleTextStyle, b?.titleTextStyle, t),
contentTextStyle: TextStyle.lerp(a?.contentTextStyle, b?.contentTextStyle, t),
int get hashCode => shape.hashCode;
bool operator ==(dynamic other) {
if (identical(this, other))
return true;
if (other.runtimeType != runtimeType)
return false;
final DialogTheme typedOther = other;
return typedOther.backgroundColor == backgroundColor
&& typedOther.elevation == elevation
&& typedOther.shape == shape
&& typedOther.titleTextStyle == titleTextStyle
&& typedOther.contentTextStyle == contentTextStyle;
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
properties.add(ColorProperty('backgroundColor', backgroundColor));
properties.add(DiagnosticsProperty<ShapeBorder>('shape', shape, defaultValue: null));
properties.add(DoubleProperty('elevation', elevation));
properties.add(DiagnosticsProperty<TextStyle>('titleTextStyle', titleTextStyle, defaultValue: null));
properties.add(DiagnosticsProperty<TextStyle>('contentTextStyle', contentTextStyle, defaultValue: null));