mirror of
https://github.com/flutter/flutter
synced 2024-10-30 01:59:05 +00:00
Implement operator = and hashcode for CupertinoThemeData (#89604)
This fixes #71222 * Implement operator = and hashcode for CupertinoThemeData and CupertinoTextThemeData which CupertinoThemeData depends on. * Add basic tests for CupertinoThemeData equality and hashcode. I also manually tested the case mentioned in #71222, e.g. equality of ThemeData(cupertinoOverrideTheme: someTheme) Co-authored-by: Jacob Simionato <jsimionato@google.com>
This commit is contained in:
parent
9cea691752
commit
bf8e1270a7
4 changed files with 140 additions and 1 deletions
|
@ -247,6 +247,44 @@ class CupertinoTextThemeData with Diagnosticable {
|
|||
);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (other.runtimeType != runtimeType) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Warning: make sure these properties are in the exact same order as in
|
||||
// hashValues() and in the raw constructor and in the order of fields in
|
||||
// the class and in the lerp() method.
|
||||
return other is CupertinoTextThemeData &&
|
||||
other.textStyle == textStyle &&
|
||||
other.actionTextStyle == actionTextStyle &&
|
||||
other.tabLabelTextStyle == tabLabelTextStyle &&
|
||||
other.navTitleTextStyle == navTitleTextStyle &&
|
||||
other.navLargeTitleTextStyle == navLargeTitleTextStyle &&
|
||||
other.navActionTextStyle == navActionTextStyle &&
|
||||
other.pickerTextStyle == pickerTextStyle &&
|
||||
other.dateTimePickerTextStyle == dateTimePickerTextStyle;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
// Warning: For the sanity of the reader, please make sure these properties
|
||||
// are in the exact same order as in operator == and in the raw constructor
|
||||
// and in the order of fields in the class and in the lerp() method.
|
||||
final List<Object?> values = <Object?>[
|
||||
textStyle,
|
||||
actionTextStyle,
|
||||
tabLabelTextStyle,
|
||||
navTitleTextStyle,
|
||||
navLargeTitleTextStyle,
|
||||
navActionTextStyle,
|
||||
pickerTextStyle,
|
||||
dateTimePickerTextStyle,
|
||||
];
|
||||
return hashList(values);
|
||||
}
|
||||
|
||||
@override
|
||||
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
||||
super.debugFillProperties(properties);
|
||||
|
|
|
@ -290,6 +290,38 @@ class CupertinoThemeData extends NoDefaultCupertinoThemeData with Diagnosticable
|
|||
);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (other.runtimeType != runtimeType)
|
||||
return false;
|
||||
// Warning: make sure these properties are in the exact same order as in
|
||||
// hashValues() and in the raw constructor and in the order of fields in
|
||||
// the class and in the lerp() method.
|
||||
return other is CupertinoThemeData &&
|
||||
other.brightness == brightness &&
|
||||
other.primaryColor == primaryColor &&
|
||||
other.primaryContrastingColor == primaryContrastingColor &&
|
||||
other.textTheme == textTheme &&
|
||||
other.barBackgroundColor == barBackgroundColor &&
|
||||
other.scaffoldBackgroundColor == scaffoldBackgroundColor;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
// Warning: For the sanity of the reader, please make sure these properties
|
||||
// are in the exact same order as in operator == and in the raw constructor
|
||||
// and in the order of fields in the class and in the lerp() method.
|
||||
final List<Object?> values = <Object?>[
|
||||
brightness,
|
||||
primaryColor,
|
||||
primaryContrastingColor,
|
||||
textTheme,
|
||||
barBackgroundColor,
|
||||
scaffoldBackgroundColor,
|
||||
];
|
||||
return hashList(values);
|
||||
}
|
||||
|
||||
@override
|
||||
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
||||
super.debugFillProperties(properties);
|
||||
|
@ -315,6 +347,7 @@ class CupertinoThemeData extends NoDefaultCupertinoThemeData with Diagnosticable
|
|||
///
|
||||
/// * [CupertinoThemeData], which uses reasonable default values for
|
||||
/// unspecified theme properties.
|
||||
@immutable
|
||||
class NoDefaultCupertinoThemeData {
|
||||
/// Creates a [NoDefaultCupertinoThemeData] styling specification.
|
||||
///
|
||||
|
@ -442,6 +475,38 @@ class NoDefaultCupertinoThemeData {
|
|||
scaffoldBackgroundColor: scaffoldBackgroundColor ?? this.scaffoldBackgroundColor,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (other.runtimeType != runtimeType)
|
||||
return false;
|
||||
// Warning: make sure these properties are in the exact same order as in
|
||||
// hashValues() and in the raw constructor and in the order of fields in
|
||||
// the class and in the lerp() method.
|
||||
return other is NoDefaultCupertinoThemeData &&
|
||||
other.brightness == brightness &&
|
||||
other.primaryColor == primaryColor &&
|
||||
other.primaryContrastingColor == primaryContrastingColor &&
|
||||
other.textTheme == textTheme &&
|
||||
other.barBackgroundColor == barBackgroundColor &&
|
||||
other.scaffoldBackgroundColor == scaffoldBackgroundColor;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
// Warning: For the sanity of the reader, please make sure these properties
|
||||
// are in the exact same order as in operator == and in the raw constructor
|
||||
// and in the order of fields in the class and in the lerp() method.
|
||||
final List<Object?> values = <Object?>[
|
||||
brightness,
|
||||
primaryColor,
|
||||
primaryContrastingColor,
|
||||
textTheme,
|
||||
barBackgroundColor,
|
||||
scaffoldBackgroundColor,
|
||||
];
|
||||
return hashList(values);
|
||||
}
|
||||
}
|
||||
|
||||
@immutable
|
||||
|
|
|
@ -206,6 +206,41 @@ void main() {
|
|||
);
|
||||
});
|
||||
|
||||
test('Theme operator == returns correct value for simple cases', () {
|
||||
expect(const CupertinoThemeData(), equals(const CupertinoThemeData()));
|
||||
|
||||
expect(const CupertinoThemeData(brightness: Brightness.light),
|
||||
isNot(equals(const CupertinoThemeData(brightness: Brightness.dark))));
|
||||
|
||||
expect(
|
||||
const CupertinoThemeData(
|
||||
textTheme: CupertinoTextThemeData(
|
||||
primaryColor: CupertinoColors.activeGreen)),
|
||||
isNot(equals(const CupertinoThemeData(
|
||||
textTheme: CupertinoTextThemeData(
|
||||
primaryColor: CupertinoColors.activeOrange)))));
|
||||
});
|
||||
|
||||
test('hashCode behaves correctly for simple cases', () {
|
||||
expect(const CupertinoThemeData().hashCode,
|
||||
equals(const CupertinoThemeData().hashCode));
|
||||
|
||||
expect(
|
||||
const CupertinoThemeData(brightness: Brightness.light).hashCode,
|
||||
isNot(equals(const CupertinoThemeData(brightness: Brightness.dark))
|
||||
.hashCode));
|
||||
|
||||
expect(
|
||||
const CupertinoThemeData(
|
||||
textTheme: CupertinoTextThemeData(
|
||||
primaryColor: CupertinoColors.activeGreen))
|
||||
.hashCode,
|
||||
isNot(equals(const CupertinoThemeData(
|
||||
textTheme: CupertinoTextThemeData(
|
||||
primaryColor: CupertinoColors.activeOrange))
|
||||
.hashCode)));
|
||||
});
|
||||
|
||||
late Brightness currentBrightness;
|
||||
void colorMatches(Color? componentColor, CupertinoDynamicColor expectedDynamicColor) {
|
||||
switch (currentBrightness) {
|
||||
|
|
|
@ -591,7 +591,8 @@ void main() {
|
|||
),
|
||||
));
|
||||
|
||||
expect(buildCount, 2);
|
||||
// Widget does not rebuild as theme color remains overriden.
|
||||
expect(buildCount, 1);
|
||||
expect(theme.primaryColor, CupertinoColors.activeOrange);
|
||||
},
|
||||
);
|
||||
|
|
Loading…
Reference in a new issue