Skip to content

Commit 826bb0a

Browse files
authored
Provide a helpful error message when ColorScheme.brightness doesn't match ThemeData.brightness (#137611)
fixes [Unexpected behaviour with ColorScheme.fromSeed and Brightness.dark](flutter/flutter#127523)
1 parent aa3436d commit 826bb0a

File tree

2 files changed

+102
-1
lines changed

2 files changed

+102
-1
lines changed

packages/flutter/lib/src/material/theme_data.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,12 @@ class ThemeData with Diagnosticable {
388388
: InkSplash.splashFactory;
389389

390390
// COLOR
391-
assert(colorScheme?.brightness == null || brightness == null || colorScheme!.brightness == brightness);
391+
assert(
392+
colorScheme?.brightness == null || brightness == null || colorScheme!.brightness == brightness,
393+
'ThemeData.brightness does not match ColorScheme.brightness. '
394+
'Either override ColorScheme.brightness or ThemeData.brightness to '
395+
'match the other.'
396+
);
392397
assert(colorSchemeSeed == null || colorScheme == null);
393398
assert(colorSchemeSeed == null || primarySwatch == null);
394399
assert(colorSchemeSeed == null || primaryColor == null);

packages/flutter/test/material/theme_data_test.dart

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,6 +1284,102 @@ void main() {
12841284
// Ensure they are all there.
12851285
expect(propertyNames, expectedPropertyNames);
12861286
});
1287+
1288+
testWidgetsWithLeakTracking(
1289+
'ThemeData.brightness not matching ColorScheme.brightness throws a helpful error message', (WidgetTester tester) async {
1290+
AssertionError? error;
1291+
1292+
// Test `ColorScheme.light()` and `ThemeData.brightness == Brightness.dark`.
1293+
try {
1294+
await tester.pumpWidget(
1295+
MaterialApp(
1296+
theme: ThemeData(
1297+
colorScheme: const ColorScheme.light(),
1298+
brightness: Brightness.dark,
1299+
),
1300+
home: const Placeholder(),
1301+
),
1302+
);
1303+
} on AssertionError catch (e) {
1304+
error = e;
1305+
} finally {
1306+
expect(error, isNotNull);
1307+
expect(error?.message, contains(
1308+
'ThemeData.brightness does not match ColorScheme.brightness. '
1309+
'Either override ColorScheme.brightness or ThemeData.brightness to '
1310+
'match the other.'
1311+
));
1312+
}
1313+
1314+
// Test `ColorScheme.dark()` and `ThemeData.brightness == Brightness.light`.
1315+
try {
1316+
await tester.pumpWidget(
1317+
MaterialApp(
1318+
theme: ThemeData(
1319+
colorScheme: const ColorScheme.dark(),
1320+
brightness: Brightness.light,
1321+
),
1322+
home: const Placeholder(),
1323+
),
1324+
);
1325+
} on AssertionError catch (e) {
1326+
error = e;
1327+
} finally {
1328+
expect(error, isNotNull);
1329+
expect(error?.message, contains(
1330+
'ThemeData.brightness does not match ColorScheme.brightness. '
1331+
'Either override ColorScheme.brightness or ThemeData.brightness to '
1332+
'match the other.'
1333+
));
1334+
}
1335+
1336+
// Test `ColorScheme.fromSeed()` and `ThemeData.brightness == Brightness.dark`.
1337+
try {
1338+
await tester.pumpWidget(
1339+
MaterialApp(
1340+
theme: ThemeData(
1341+
colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xffff0000)),
1342+
brightness: Brightness.dark,
1343+
),
1344+
home: const Placeholder(),
1345+
),
1346+
);
1347+
} on AssertionError catch (e) {
1348+
error = e;
1349+
} finally {
1350+
expect(error, isNotNull);
1351+
expect(error?.message, contains(
1352+
'ThemeData.brightness does not match ColorScheme.brightness. '
1353+
'Either override ColorScheme.brightness or ThemeData.brightness to '
1354+
'match the other.'
1355+
));
1356+
}
1357+
1358+
// Test `ColorScheme.fromSeed()` using `Brightness.dark` and `ThemeData.brightness == Brightness.light`.
1359+
try {
1360+
await tester.pumpWidget(
1361+
MaterialApp(
1362+
theme: ThemeData(
1363+
colorScheme: ColorScheme.fromSeed(
1364+
seedColor: const Color(0xffff0000),
1365+
brightness: Brightness.dark,
1366+
),
1367+
brightness: Brightness.light,
1368+
),
1369+
home: const Placeholder(),
1370+
),
1371+
);
1372+
} on AssertionError catch (e) {
1373+
error = e;
1374+
} finally {
1375+
expect(error, isNotNull);
1376+
expect(error?.message, contains(
1377+
'ThemeData.brightness does not match ColorScheme.brightness. '
1378+
'Either override ColorScheme.brightness or ThemeData.brightness to '
1379+
'match the other.'
1380+
));
1381+
}
1382+
});
12871383
}
12881384

12891385
@immutable

0 commit comments

Comments
 (0)