Update ThemeData.dialogTheme type to accept DialogThemeData (#155129)

Following https://github.com/flutter/flutter/pull/153982, this PR is to normalize `ThemeData.dialogTheme`; change the `DialogTheme dialogTheme` property to `DialogThemeData dialogTheme` in ThemeData. In `ThemeData()` and `ThemeData.copyWith()`, the dialogTheme parameter type is changed to `Object?` to accept both `DialogTheme` and `DialogThemeData` so that we won't cause immediate breaking change and make sure rolling is smooth. Once all component themes are normalized, these `Object?` types should be changed to `xxxThemeData`.

There's no way to create a dart fix because we can't add a "@deprecated" label for `DialogTheme`; `DialogTheme` is a new `InheritedWidget` subclass now.

Addresses the "theme normalization" sub project within https://github.com/flutter/flutter/issues/91772
This commit is contained in:
Qun Cheng 2024-10-02 16:48:13 -07:00 committed by GitHub
parent 07745fb41f
commit 64906c28a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 161 additions and 37 deletions

View File

@ -707,7 +707,7 @@ class _DatePickerDialogState extends State<DatePickerDialog> with RestorationMix
// layout issues. // layout issues.
final double textScaleFactor = MediaQuery.textScalerOf(context).clamp(maxScaleFactor: _kMaxTextScaleFactor).scale(_fontSizeToScale) / _fontSizeToScale; final double textScaleFactor = MediaQuery.textScalerOf(context).clamp(maxScaleFactor: _kMaxTextScaleFactor).scale(_fontSizeToScale) / _fontSizeToScale;
final Size dialogSize = _dialogSize(context) * textScaleFactor; final Size dialogSize = _dialogSize(context) * textScaleFactor;
final DialogTheme dialogTheme = theme.dialogTheme; final DialogThemeData dialogTheme = theme.dialogTheme;
return Dialog( return Dialog(
backgroundColor: datePickerTheme.backgroundColor ?? defaults.backgroundColor, backgroundColor: datePickerTheme.backgroundColor ?? defaults.backgroundColor,
elevation: useMaterial3 elevation: useMaterial3
@ -1660,7 +1660,7 @@ class _DateRangePickerDialogState extends State<DateRangePickerDialog> with Rest
: localizations.dateRangePickerHelpText.toUpperCase() : localizations.dateRangePickerHelpText.toUpperCase()
), ),
); );
final DialogTheme dialogTheme = theme.dialogTheme; final DialogThemeData dialogTheme = theme.dialogTheme;
size = orientation == Orientation.portrait size = orientation == Orientation.portrait
? (useMaterial3 ? _inputPortraitDialogSizeM3 : _inputPortraitDialogSizeM2) ? (useMaterial3 ? _inputPortraitDialogSizeM3 : _inputPortraitDialogSizeM2)
: _inputRangeLandscapeDialogSize; : _inputRangeLandscapeDialogSize;

View File

@ -230,7 +230,7 @@ class Dialog extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context); final ThemeData theme = Theme.of(context);
final DialogThemeData dialogTheme = DialogTheme.of(context).data; final DialogThemeData dialogTheme = DialogTheme.of(context);
final EdgeInsets effectivePadding = MediaQuery.viewInsetsOf(context) final EdgeInsets effectivePadding = MediaQuery.viewInsetsOf(context)
+ (insetPadding ?? dialogTheme.insetPadding ?? _defaultInsetPadding); + (insetPadding ?? dialogTheme.insetPadding ?? _defaultInsetPadding);
final DialogThemeData defaults = theme.useMaterial3 final DialogThemeData defaults = theme.useMaterial3
@ -720,7 +720,7 @@ class AlertDialog extends StatelessWidget {
assert(debugCheckHasMaterialLocalizations(context)); assert(debugCheckHasMaterialLocalizations(context));
final ThemeData theme = Theme.of(context); final ThemeData theme = Theme.of(context);
final DialogThemeData dialogTheme = DialogTheme.of(context).data; final DialogThemeData dialogTheme = DialogTheme.of(context);
final DialogThemeData defaults = theme.useMaterial3 ? _DialogDefaultsM3(context) : _DialogDefaultsM2(context); final DialogThemeData defaults = theme.useMaterial3 ? _DialogDefaultsM3(context) : _DialogDefaultsM2(context);
String? label = semanticLabel; String? label = semanticLabel;
@ -1235,7 +1235,7 @@ class SimpleDialog extends StatelessWidget {
// The paddingScaleFactor is used to adjust the padding of Dialog // The paddingScaleFactor is used to adjust the padding of Dialog
// children. // children.
final TextStyle defaultTextStyle = titleTextStyle ?? DialogTheme.of(context).data.titleTextStyle ?? theme.textTheme.titleLarge!; final TextStyle defaultTextStyle = titleTextStyle ?? DialogTheme.of(context).titleTextStyle ?? theme.textTheme.titleLarge!;
final double fontSize = defaultTextStyle.fontSize ?? kDefaultFontSize; final double fontSize = defaultTextStyle.fontSize ?? kDefaultFontSize;
final double fontSizeToScale = fontSize == 0.0 ? kDefaultFontSize : fontSize; final double fontSizeToScale = fontSize == 0.0 ? kDefaultFontSize : fontSize;
final double effectiveTextScale = MediaQuery.textScalerOf(context).scale(fontSizeToScale) / fontSizeToScale; final double effectiveTextScale = MediaQuery.textScalerOf(context).scale(fontSizeToScale) / fontSizeToScale;
@ -1445,7 +1445,7 @@ Future<T?> showDialog<T>({
builder: builder, builder: builder,
barrierColor: barrierColor barrierColor: barrierColor
?? DialogTheme.of(context).barrierColor ?? DialogTheme.of(context).barrierColor
?? Theme.of(context).dialogTheme.data.barrierColor ?? Theme.of(context).dialogTheme.barrierColor
?? Colors.black54, ?? Colors.black54,
barrierDismissible: barrierDismissible, barrierDismissible: barrierDismissible,
barrierLabel: barrierLabel, barrierLabel: barrierLabel,

View File

@ -190,9 +190,9 @@ class DialogTheme extends InheritedTheme with Diagnosticable {
} }
/// The [ThemeData.dialogTheme] property of the ambient [Theme]. /// The [ThemeData.dialogTheme] property of the ambient [Theme].
static DialogTheme of(BuildContext context) { static DialogThemeData of(BuildContext context) {
final DialogTheme? dialogTheme = context.dependOnInheritedWidgetOfExactType<DialogTheme>(); final DialogTheme? dialogTheme = context.dependOnInheritedWidgetOfExactType<DialogTheme>();
return dialogTheme ?? Theme.of(context).dialogTheme; return dialogTheme?.data ?? Theme.of(context).dialogTheme;
} }
@override @override

View File

@ -320,7 +320,8 @@ class ThemeData with Diagnosticable {
ChipThemeData? chipTheme, ChipThemeData? chipTheme,
DataTableThemeData? dataTableTheme, DataTableThemeData? dataTableTheme,
DatePickerThemeData? datePickerTheme, DatePickerThemeData? datePickerTheme,
DialogTheme? dialogTheme, // TODO(QuncCccccc): Change the parameter type to DialogThemeData
Object? dialogTheme,
DividerThemeData? dividerTheme, DividerThemeData? dividerTheme,
DrawerThemeData? drawerTheme, DrawerThemeData? drawerTheme,
DropdownMenuThemeData? dropdownMenuTheme, DropdownMenuThemeData? dropdownMenuTheme,
@ -497,7 +498,15 @@ class ThemeData with Diagnosticable {
chipTheme ??= const ChipThemeData(); chipTheme ??= const ChipThemeData();
dataTableTheme ??= const DataTableThemeData(); dataTableTheme ??= const DataTableThemeData();
datePickerTheme ??= const DatePickerThemeData(); datePickerTheme ??= const DatePickerThemeData();
dialogTheme ??= const DialogTheme(); // TODO(QuncCccccc): Clean this up once the type of `dialogTheme` is changed to `DialogThemeData`
if (dialogTheme != null) {
if (dialogTheme is DialogTheme) {
dialogTheme = dialogTheme.data;
} else if (dialogTheme is! DialogThemeData) {
throw ArgumentError('dialogTheme must be either a DialogThemeData or a DialogTheme');
}
}
dialogTheme ??= const DialogThemeData();
dividerTheme ??= const DividerThemeData(); dividerTheme ??= const DividerThemeData();
drawerTheme ??= const DrawerThemeData(); drawerTheme ??= const DrawerThemeData();
dropdownMenuTheme ??= const DropdownMenuThemeData(); dropdownMenuTheme ??= const DropdownMenuThemeData();
@ -590,7 +599,7 @@ class ThemeData with Diagnosticable {
chipTheme: chipTheme, chipTheme: chipTheme,
dataTableTheme: dataTableTheme, dataTableTheme: dataTableTheme,
datePickerTheme: datePickerTheme, datePickerTheme: datePickerTheme,
dialogTheme: dialogTheme, dialogTheme: dialogTheme as DialogThemeData,
dividerTheme: dividerTheme, dividerTheme: dividerTheme,
drawerTheme: drawerTheme, drawerTheme: drawerTheme,
dropdownMenuTheme: dropdownMenuTheme, dropdownMenuTheme: dropdownMenuTheme,
@ -1276,7 +1285,7 @@ class ThemeData with Diagnosticable {
final DatePickerThemeData datePickerTheme; final DatePickerThemeData datePickerTheme;
/// A theme for customizing the shape of a dialog. /// A theme for customizing the shape of a dialog.
final DialogTheme dialogTheme; final DialogThemeData dialogTheme;
/// A theme for customizing the color, thickness, and indents of [Divider]s, /// A theme for customizing the color, thickness, and indents of [Divider]s,
/// [VerticalDivider]s, etc. /// [VerticalDivider]s, etc.
@ -1462,7 +1471,8 @@ class ThemeData with Diagnosticable {
ChipThemeData? chipTheme, ChipThemeData? chipTheme,
DataTableThemeData? dataTableTheme, DataTableThemeData? dataTableTheme,
DatePickerThemeData? datePickerTheme, DatePickerThemeData? datePickerTheme,
DialogTheme? dialogTheme, // TODO(QuncCccccc): Change the parameter type to DialogThemeData
Object? dialogTheme,
DividerThemeData? dividerTheme, DividerThemeData? dividerTheme,
DrawerThemeData? drawerTheme, DrawerThemeData? drawerTheme,
DropdownMenuThemeData? dropdownMenuTheme, DropdownMenuThemeData? dropdownMenuTheme,
@ -1510,6 +1520,15 @@ class ThemeData with Diagnosticable {
ButtonBarThemeData? buttonBarTheme, ButtonBarThemeData? buttonBarTheme,
}) { }) {
cupertinoOverrideTheme = cupertinoOverrideTheme?.noDefault(); cupertinoOverrideTheme = cupertinoOverrideTheme?.noDefault();
// TODO(QuncCccccc): Clean this up once the type of `dialogTheme` is changed to `DialogThemeData`
if (dialogTheme != null) {
if (dialogTheme is DialogTheme) {
dialogTheme = dialogTheme.data;
} else if (dialogTheme is! DialogThemeData) {
throw ArgumentError('dialogTheme must be either a DialogThemeData or a DialogTheme');
}
}
return ThemeData.raw( return ThemeData.raw(
// For the sanity of the reader, make sure these properties are in the same // For the sanity of the reader, make sure these properties are in the same
// order in every place that they are separated by section comments (e.g. // order in every place that they are separated by section comments (e.g.
@ -1571,7 +1590,7 @@ class ThemeData with Diagnosticable {
chipTheme: chipTheme ?? this.chipTheme, chipTheme: chipTheme ?? this.chipTheme,
dataTableTheme: dataTableTheme ?? this.dataTableTheme, dataTableTheme: dataTableTheme ?? this.dataTableTheme,
datePickerTheme: datePickerTheme ?? this.datePickerTheme, datePickerTheme: datePickerTheme ?? this.datePickerTheme,
dialogTheme: dialogTheme ?? this.dialogTheme, dialogTheme: dialogTheme as DialogThemeData? ?? this.dialogTheme,
dividerTheme: dividerTheme ?? this.dividerTheme, dividerTheme: dividerTheme ?? this.dividerTheme,
drawerTheme: drawerTheme ?? this.drawerTheme, drawerTheme: drawerTheme ?? this.drawerTheme,
dropdownMenuTheme: dropdownMenuTheme ?? this.dropdownMenuTheme, dropdownMenuTheme: dropdownMenuTheme ?? this.dropdownMenuTheme,
@ -1764,7 +1783,7 @@ class ThemeData with Diagnosticable {
chipTheme: ChipThemeData.lerp(a.chipTheme, b.chipTheme, t)!, chipTheme: ChipThemeData.lerp(a.chipTheme, b.chipTheme, t)!,
dataTableTheme: DataTableThemeData.lerp(a.dataTableTheme, b.dataTableTheme, t), dataTableTheme: DataTableThemeData.lerp(a.dataTableTheme, b.dataTableTheme, t),
datePickerTheme: DatePickerThemeData.lerp(a.datePickerTheme, b.datePickerTheme, t), datePickerTheme: DatePickerThemeData.lerp(a.datePickerTheme, b.datePickerTheme, t),
dialogTheme: DialogTheme.lerp(a.dialogTheme, b.dialogTheme, t), dialogTheme: DialogThemeData.lerp(a.dialogTheme, b.dialogTheme, t),
dividerTheme: DividerThemeData.lerp(a.dividerTheme, b.dividerTheme, t), dividerTheme: DividerThemeData.lerp(a.dividerTheme, b.dividerTheme, t),
drawerTheme: DrawerThemeData.lerp(a.drawerTheme, b.drawerTheme, t)!, drawerTheme: DrawerThemeData.lerp(a.drawerTheme, b.drawerTheme, t)!,
dropdownMenuTheme: DropdownMenuThemeData.lerp(a.dropdownMenuTheme, b.dropdownMenuTheme, t), dropdownMenuTheme: DropdownMenuThemeData.lerp(a.dropdownMenuTheme, b.dropdownMenuTheme, t),
@ -2062,7 +2081,7 @@ class ThemeData with Diagnosticable {
properties.add(DiagnosticsProperty<ChipThemeData>('chipTheme', chipTheme, level: DiagnosticLevel.debug)); properties.add(DiagnosticsProperty<ChipThemeData>('chipTheme', chipTheme, level: DiagnosticLevel.debug));
properties.add(DiagnosticsProperty<DataTableThemeData>('dataTableTheme', dataTableTheme, defaultValue: defaultData.dataTableTheme, level: DiagnosticLevel.debug)); properties.add(DiagnosticsProperty<DataTableThemeData>('dataTableTheme', dataTableTheme, defaultValue: defaultData.dataTableTheme, level: DiagnosticLevel.debug));
properties.add(DiagnosticsProperty<DatePickerThemeData>('datePickerTheme', datePickerTheme, defaultValue: defaultData.datePickerTheme, level: DiagnosticLevel.debug)); properties.add(DiagnosticsProperty<DatePickerThemeData>('datePickerTheme', datePickerTheme, defaultValue: defaultData.datePickerTheme, level: DiagnosticLevel.debug));
properties.add(DiagnosticsProperty<DialogTheme>('dialogTheme', dialogTheme, defaultValue: defaultData.dialogTheme, level: DiagnosticLevel.debug)); properties.add(DiagnosticsProperty<DialogThemeData>('dialogTheme', dialogTheme, defaultValue: defaultData.dialogTheme, level: DiagnosticLevel.debug));
properties.add(DiagnosticsProperty<DividerThemeData>('dividerTheme', dividerTheme, defaultValue: defaultData.dividerTheme, level: DiagnosticLevel.debug)); properties.add(DiagnosticsProperty<DividerThemeData>('dividerTheme', dividerTheme, defaultValue: defaultData.dividerTheme, level: DiagnosticLevel.debug));
properties.add(DiagnosticsProperty<DrawerThemeData>('drawerTheme', drawerTheme, defaultValue: defaultData.drawerTheme, level: DiagnosticLevel.debug)); properties.add(DiagnosticsProperty<DrawerThemeData>('drawerTheme', drawerTheme, defaultValue: defaultData.drawerTheme, level: DiagnosticLevel.debug));
properties.add(DiagnosticsProperty<DropdownMenuThemeData>('dropdownMenuTheme', dropdownMenuTheme, defaultValue: defaultData.dropdownMenuTheme, level: DiagnosticLevel.debug)); properties.add(DiagnosticsProperty<DropdownMenuThemeData>('dropdownMenuTheme', dropdownMenuTheme, defaultValue: defaultData.dropdownMenuTheme, level: DiagnosticLevel.debug));

View File

@ -603,7 +603,7 @@ void main() {
expect(defaultDialogMaterial.elevation, datePickerDefaultDialogTheme.elevation); expect(defaultDialogMaterial.elevation, datePickerDefaultDialogTheme.elevation);
// Test that it honors ThemeData.dialogTheme settings // Test that it honors ThemeData.dialogTheme settings
const DialogTheme customDialogTheme = DialogTheme( const DialogThemeData customDialogTheme = DialogThemeData(
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(40.0)), borderRadius: BorderRadius.all(Radius.circular(40.0)),
), ),

View File

@ -244,13 +244,118 @@ void main() {
expect(padding.padding, themeActionsPadding); expect(padding.padding, themeActionsPadding);
}); });
testWidgets('Local DialogThemeData overrides global dialogTheme', (WidgetTester tester) async {
const Color themeBackgroundColor = Color(0xff123456);
const double themeElevation = 8.0;
const Color themeShadowColor = Color(0xff000001);
const Color themeSurfaceTintColor = Color(0xff000002);
const BeveledRectangleBorder themeShape = BeveledRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20.5)));
const AlignmentGeometry themeAlignment = Alignment.bottomLeft;
const Color themeIconColor = Color(0xff654321);
const TextStyle themeTitleTextStyle = TextStyle(color: Color(0xffffffff));
const TextStyle themeContentTextStyle = TextStyle(color: Color(0xff000000));
const EdgeInsetsGeometry themeActionsPadding = EdgeInsets.all(8.0);
const Color themeBarrierColor = Color(0xff000005);
const EdgeInsets themeInsetPadding = EdgeInsets.all(30.0);
const Clip themeClipBehavior = Clip.antiAlias;
const Color globalBackgroundColor = Color(0xff654321);
const double globalElevation = 7.0;
const Color globalShadowColor = Color(0xff200001);
const Color globalSurfaceTintColor = Color(0xff222002);
const BeveledRectangleBorder globalShape = BeveledRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(25.5)));
const AlignmentGeometry globalAlignment = Alignment.centerRight;
const Color globalIconColor = Color(0xff666666);
const TextStyle globalTitleTextStyle = TextStyle(color: Color(0xff000000));
const TextStyle globalContentTextStyle = TextStyle(color: Color(0xffdddddd));
const EdgeInsetsGeometry globalActionsPadding = EdgeInsets.all(18.0);
const Color globalBarrierColor = Color(0xff111115);
const EdgeInsets globalInsetPadding = EdgeInsets.all(35.0);
const Clip globalClipBehavior = Clip.hardEdge;
const AlertDialog dialog = AlertDialog(
title: Text('Title'),
content: Text('Content'),
icon: Icon(Icons.search),
actions: <Widget>[
Icon(Icons.cancel)
],
);
const DialogThemeData dialogTheme = DialogThemeData(
backgroundColor: themeBackgroundColor,
elevation: themeElevation,
shadowColor: themeShadowColor,
surfaceTintColor: themeSurfaceTintColor,
shape: themeShape,
alignment: themeAlignment,
iconColor: themeIconColor,
titleTextStyle: themeTitleTextStyle,
contentTextStyle: themeContentTextStyle,
actionsPadding: themeActionsPadding,
barrierColor: themeBarrierColor,
insetPadding: themeInsetPadding,
clipBehavior: themeClipBehavior,
);
const DialogThemeData globalDialogTheme = DialogThemeData(
backgroundColor: globalBackgroundColor,
elevation: globalElevation,
shadowColor: globalShadowColor,
surfaceTintColor: globalSurfaceTintColor,
shape: globalShape,
alignment: globalAlignment,
iconColor: globalIconColor,
titleTextStyle: globalTitleTextStyle,
contentTextStyle: globalContentTextStyle,
actionsPadding: globalActionsPadding,
barrierColor: globalBarrierColor,
insetPadding: globalInsetPadding,
clipBehavior: globalClipBehavior,
);
await tester.pumpWidget(_appWithDialog(
tester,
dialog,
dialogTheme: dialogTheme,
theme: ThemeData(dialogTheme: globalDialogTheme),
));
await tester.tap(find.text('X'));
await tester.pumpAndSettle();
final Material materialWidget = _getMaterialAlertDialog(tester);
expect(materialWidget.color, themeBackgroundColor);
expect(materialWidget.elevation, themeElevation);
expect(materialWidget.shadowColor, themeShadowColor);
expect(materialWidget.surfaceTintColor, themeSurfaceTintColor);
expect(materialWidget.shape, themeShape);
expect(materialWidget.clipBehavior, Clip.antiAlias);
final Offset bottomLeft = tester.getBottomLeft(find.descendant(
of: find.byType(Dialog),
matching: find.byType(Material)
));
expect(bottomLeft.dx, 30.0); // 30 is the padding value.
expect(bottomLeft.dy, 570.0); // 600 - 30
expect(_getIconRenderObject(tester, Icons.search).text.style?.color, themeIconColor);
expect(_getTextRenderObject(tester, 'Title').text.style?.color, themeTitleTextStyle.color);
expect(_getTextRenderObject(tester, 'Content').text.style?.color, themeContentTextStyle.color);
final ModalBarrier modalBarrier = tester.widget(find.byType(ModalBarrier).last);
expect(modalBarrier.color, themeBarrierColor);
final Finder findPadding = find.ancestor(
of: find.byIcon(Icons.cancel),
matching: find.byType(Padding)
).first;
final Padding padding = tester.widget<Padding>(findPadding);
expect(padding.padding, themeActionsPadding);
});
testWidgets('Dialog background color', (WidgetTester tester) async { testWidgets('Dialog background color', (WidgetTester tester) async {
const Color customColor = Colors.pink; const Color customColor = Colors.pink;
const AlertDialog dialog = AlertDialog( const AlertDialog dialog = AlertDialog(
title: Text('Title'), title: Text('Title'),
actions: <Widget>[ ], actions: <Widget>[ ],
); );
final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(backgroundColor: customColor)); final ThemeData theme = ThemeData(dialogTheme: const DialogThemeData(backgroundColor: customColor));
await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme)); await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme));
await tester.tap(find.text('X')); await tester.tap(find.text('X'));
@ -269,7 +374,7 @@ void main() {
actions: <Widget>[ ], actions: <Widget>[ ],
); );
final ThemeData theme = ThemeData( final ThemeData theme = ThemeData(
dialogTheme: const DialogTheme( dialogTheme: const DialogThemeData(
elevation: customElevation, elevation: customElevation,
shadowColor: shadowColor, shadowColor: shadowColor,
surfaceTintColor: surfaceTintColor, surfaceTintColor: surfaceTintColor,
@ -295,7 +400,7 @@ void main() {
title: Text('Title'), title: Text('Title'),
actions: <Widget>[ ], actions: <Widget>[ ],
); );
final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(shape: customBorder)); final ThemeData theme = ThemeData(dialogTheme: const DialogThemeData(shape: customBorder));
await tester.pumpWidget( await tester.pumpWidget(
_appWithDialog(tester, dialog, theme: theme), _appWithDialog(tester, dialog, theme: theme),
@ -312,7 +417,7 @@ void main() {
title: Text('Title'), title: Text('Title'),
actions: <Widget>[ ], actions: <Widget>[ ],
); );
final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(alignment: Alignment.bottomLeft)); final ThemeData theme = ThemeData(dialogTheme: const DialogThemeData(alignment: Alignment.bottomLeft));
await tester.pumpWidget( await tester.pumpWidget(
_appWithDialog(tester, dialog, theme: theme), _appWithDialog(tester, dialog, theme: theme),
@ -335,7 +440,7 @@ void main() {
); );
final ThemeData theme = ThemeData( final ThemeData theme = ThemeData(
useMaterial3: true, useMaterial3: true,
dialogTheme: const DialogTheme(alignment: Alignment.bottomLeft), dialogTheme: const DialogThemeData(alignment: Alignment.bottomLeft),
); );
await tester.pumpWidget( await tester.pumpWidget(
@ -359,7 +464,7 @@ void main() {
actions: <Widget>[ ], actions: <Widget>[ ],
alignment: Alignment.topRight, alignment: Alignment.topRight,
); );
final ThemeData theme = ThemeData(useMaterial3: false, dialogTheme: const DialogTheme(alignment: Alignment.bottomLeft)); final ThemeData theme = ThemeData(useMaterial3: false, dialogTheme: const DialogThemeData(alignment: Alignment.bottomLeft));
await tester.pumpWidget( await tester.pumpWidget(
_appWithDialog(tester, dialog, theme: theme), _appWithDialog(tester, dialog, theme: theme),
@ -383,7 +488,7 @@ void main() {
); );
final ThemeData theme = ThemeData( final ThemeData theme = ThemeData(
useMaterial3: true, useMaterial3: true,
dialogTheme: const DialogTheme(shape: customBorder), dialogTheme: const DialogThemeData(shape: customBorder),
); );
await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme)); await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme));
@ -403,7 +508,7 @@ void main() {
title: Text('Title'), title: Text('Title'),
actions: <Widget>[ ], actions: <Widget>[ ],
); );
final ThemeData theme = ThemeData(useMaterial3: false, dialogTheme: const DialogTheme(shape: customBorder)); final ThemeData theme = ThemeData(useMaterial3: false, dialogTheme: const DialogThemeData(shape: customBorder));
await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme)); await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme));
await tester.tap(find.text('X')); await tester.tap(find.text('X'));
@ -419,7 +524,7 @@ void main() {
const Color iconColor = Colors.pink, dialogThemeColor = Colors.green, iconThemeColor = Colors.yellow; const Color iconColor = Colors.pink, dialogThemeColor = Colors.green, iconThemeColor = Colors.yellow;
final ThemeData theme = ThemeData( final ThemeData theme = ThemeData(
iconTheme: const IconThemeData(color: iconThemeColor), iconTheme: const IconThemeData(color: iconThemeColor),
dialogTheme: const DialogTheme(iconColor: dialogThemeColor), dialogTheme: const DialogThemeData(iconColor: dialogThemeColor),
); );
const AlertDialog dialog = AlertDialog( const AlertDialog dialog = AlertDialog(
icon: Icon(Icons.ac_unit), icon: Icon(Icons.ac_unit),
@ -440,7 +545,7 @@ void main() {
const Color dialogThemeColor = Colors.green, iconThemeColor = Colors.yellow; const Color dialogThemeColor = Colors.green, iconThemeColor = Colors.yellow;
final ThemeData theme = ThemeData( final ThemeData theme = ThemeData(
iconTheme: const IconThemeData(color: iconThemeColor), iconTheme: const IconThemeData(color: iconThemeColor),
dialogTheme: const DialogTheme(iconColor: dialogThemeColor), dialogTheme: const DialogThemeData(iconColor: dialogThemeColor),
); );
const AlertDialog dialog = AlertDialog( const AlertDialog dialog = AlertDialog(
icon: Icon(Icons.ac_unit), icon: Icon(Icons.ac_unit),
@ -513,7 +618,7 @@ void main() {
title: Text(titleText), title: Text(titleText),
actions: <Widget>[ ], actions: <Widget>[ ],
); );
final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(titleTextStyle: titleTextStyle)); final ThemeData theme = ThemeData(dialogTheme: const DialogThemeData(titleTextStyle: titleTextStyle));
await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme)); await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme));
await tester.tap(find.text('X')); await tester.tap(find.text('X'));
@ -573,7 +678,7 @@ void main() {
const SimpleDialog dialog = SimpleDialog( const SimpleDialog dialog = SimpleDialog(
title: Text(titleText), title: Text(titleText),
); );
final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(titleTextStyle: titleTextStyle)); final ThemeData theme = ThemeData(dialogTheme: const DialogThemeData(titleTextStyle: titleTextStyle));
await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme)); await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme));
await tester.tap(find.text('X')); await tester.tap(find.text('X'));
@ -623,7 +728,7 @@ void main() {
content: Text(contentText), content: Text(contentText),
actions: <Widget>[ ], actions: <Widget>[ ],
); );
final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(contentTextStyle: contentTextStyle)); final ThemeData theme = ThemeData(dialogTheme: const DialogThemeData(contentTextStyle: contentTextStyle));
await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme)); await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme));
await tester.tap(find.text('X')); await tester.tap(find.text('X'));
@ -664,7 +769,7 @@ void main() {
testWidgets('Custom barrierColor - Theme', (WidgetTester tester) async { testWidgets('Custom barrierColor - Theme', (WidgetTester tester) async {
const Color barrierColor = Colors.blue; const Color barrierColor = Colors.blue;
const SimpleDialog dialog = SimpleDialog(); const SimpleDialog dialog = SimpleDialog();
final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(barrierColor: barrierColor)); final ThemeData theme = ThemeData(dialogTheme: const DialogThemeData(barrierColor: barrierColor));
await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme)); await tester.pumpWidget(_appWithDialog(tester, dialog, theme: theme));
await tester.tap(find.text('X')); await tester.tap(find.text('X'));
@ -677,7 +782,7 @@ void main() {
testWidgets('DialogTheme.insetPadding updates Dialog insetPadding', (WidgetTester tester) async { testWidgets('DialogTheme.insetPadding updates Dialog insetPadding', (WidgetTester tester) async {
// The default testing screen (800, 600) // The default testing screen (800, 600)
const Rect screenRect = Rect.fromLTRB(0.0, 0.0, 800.0, 600.0); const Rect screenRect = Rect.fromLTRB(0.0, 0.0, 800.0, 600.0);
const DialogTheme dialogTheme = DialogTheme( const DialogThemeData dialogTheme = DialogThemeData(
insetPadding: EdgeInsets.fromLTRB(10, 15, 20, 25) insetPadding: EdgeInsets.fromLTRB(10, 15, 20, 25)
); );
const Dialog dialog = Dialog(child: Placeholder()); const Dialog dialog = Dialog(child: Placeholder());
@ -702,7 +807,7 @@ void main() {
}); });
testWidgets('DialogTheme.clipBehavior updates the dialogs clip behavior', (WidgetTester tester) async { testWidgets('DialogTheme.clipBehavior updates the dialogs clip behavior', (WidgetTester tester) async {
const DialogTheme dialogTheme = DialogTheme(clipBehavior: Clip.hardEdge); const DialogThemeData dialogTheme = DialogThemeData(clipBehavior: Clip.hardEdge);
const Dialog dialog = Dialog(child: Placeholder()); const Dialog dialog = Dialog(child: Placeholder());
await tester.pumpWidget(_appWithDialog( await tester.pumpWidget(_appWithDialog(
@ -723,7 +828,7 @@ void main() {
child: Placeholder(), child: Placeholder(),
); );
final ThemeData theme = ThemeData( final ThemeData theme = ThemeData(
dialogTheme: const DialogTheme(clipBehavior: Clip.hardEdge), dialogTheme: const DialogThemeData(clipBehavior: Clip.hardEdge),
); );
await tester.pumpWidget( await tester.pumpWidget(
@ -743,7 +848,7 @@ void main() {
); );
final ThemeData theme = ThemeData( final ThemeData theme = ThemeData(
useMaterial3: false, useMaterial3: false,
dialogTheme: const DialogTheme(clipBehavior: Clip.hardEdge), dialogTheme: const DialogThemeData(clipBehavior: Clip.hardEdge),
); );
await tester.pumpWidget( await tester.pumpWidget(

View File

@ -893,7 +893,7 @@ void main() {
chipTheme: chipTheme, chipTheme: chipTheme,
dataTableTheme: const DataTableThemeData(), dataTableTheme: const DataTableThemeData(),
datePickerTheme: const DatePickerThemeData(), datePickerTheme: const DatePickerThemeData(),
dialogTheme: const DialogTheme(backgroundColor: Colors.black), dialogTheme: const DialogThemeData(backgroundColor: Colors.black),
dividerTheme: const DividerThemeData(color: Colors.black), dividerTheme: const DividerThemeData(color: Colors.black),
drawerTheme: const DrawerThemeData(), drawerTheme: const DrawerThemeData(),
dropdownMenuTheme: const DropdownMenuThemeData(), dropdownMenuTheme: const DropdownMenuThemeData(),
@ -1007,7 +1007,7 @@ void main() {
chipTheme: otherChipTheme, chipTheme: otherChipTheme,
dataTableTheme: const DataTableThemeData(), dataTableTheme: const DataTableThemeData(),
datePickerTheme: const DatePickerThemeData(backgroundColor: Colors.amber), datePickerTheme: const DatePickerThemeData(backgroundColor: Colors.amber),
dialogTheme: const DialogTheme(backgroundColor: Colors.white), dialogTheme: const DialogThemeData(backgroundColor: Colors.white),
dividerTheme: const DividerThemeData(color: Colors.white), dividerTheme: const DividerThemeData(color: Colors.white),
drawerTheme: const DrawerThemeData(), drawerTheme: const DrawerThemeData(),
dropdownMenuTheme: const DropdownMenuThemeData(), dropdownMenuTheme: const DropdownMenuThemeData(),