Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 095b1ab

Browse files
authored
Checkbox borderSide lerp bug fix (#118728)
* theme override fix * add lerp condition and tests * remove unwanted changes * resolve app_bar token version * update test names
1 parent 26472b5 commit 095b1ab

File tree

2 files changed

+73
-2
lines changed

2 files changed

+73
-2
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,10 @@ class CheckboxThemeData with Diagnosticable {
192192

193193
// Special case because BorderSide.lerp() doesn't support null arguments
194194
static BorderSide? _lerpSides(BorderSide? a, BorderSide? b, double t) {
195-
if (a == null && b == null) {
195+
if (a == null || b == null) {
196196
return null;
197197
}
198-
return BorderSide.lerp(a!, b!, t);
198+
return BorderSide.lerp(a, b, t);
199199
}
200200
}
201201

packages/flutter/test/material/checkbox_theme_test.dart

+71
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,77 @@ void main() {
391391
expect(_getCheckboxMaterial(tester), paints..path(color: localThemeFillColor));
392392
expect(_getCheckboxMaterial(tester), paints..path(color: localThemeFillColor)..path(color: localThemeCheckColor));
393393
});
394+
395+
test('CheckboxThemeData lerp with null parameters', () {
396+
final CheckboxThemeData lerped = CheckboxThemeData.lerp(null, null, 0.25);
397+
398+
expect(lerped.mouseCursor, null);
399+
expect(lerped.fillColor, null);
400+
expect(lerped.checkColor, null);
401+
expect(lerped.overlayColor, null);
402+
expect(lerped.splashRadius, null);
403+
expect(lerped.materialTapTargetSize, null);
404+
expect(lerped.visualDensity, null);
405+
expect(lerped.shape, null);
406+
expect(lerped.side, null);
407+
});
408+
409+
test('CheckboxThemeData lerp from populated to null parameters', () {
410+
final CheckboxThemeData theme = CheckboxThemeData(
411+
fillColor: MaterialStateProperty.all(const Color(0xfffffff0)),
412+
checkColor: MaterialStateProperty.all(const Color(0xfffffff1)),
413+
overlayColor: MaterialStateProperty.all(const Color(0xfffffff2)),
414+
splashRadius: 3.0,
415+
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
416+
visualDensity: const VisualDensity(vertical: 1.0, horizontal: 1.0),
417+
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(4.0))),
418+
side: const BorderSide(width: 4.0),
419+
);
420+
final CheckboxThemeData lerped = CheckboxThemeData.lerp(theme, null, 0.5);
421+
422+
expect(lerped.fillColor!.resolve(<MaterialState>{}), const Color(0x80fffff0));
423+
expect(lerped.checkColor!.resolve(<MaterialState>{}), const Color(0x80fffff1));
424+
expect(lerped.overlayColor!.resolve(<MaterialState>{}), const Color(0x80fffff2));
425+
expect(lerped.splashRadius, 1.5);
426+
expect(lerped.materialTapTargetSize, null);
427+
expect(lerped.visualDensity, null);
428+
expect(lerped.shape, const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(2.0))));
429+
// Returns null if either lerp value is null.
430+
expect(lerped.side, null);
431+
});
432+
433+
test('CheckboxThemeData lerp from populated parameters', () {
434+
final CheckboxThemeData themeA = CheckboxThemeData(
435+
fillColor: MaterialStateProperty.all(const Color(0xfffffff0)),
436+
checkColor: MaterialStateProperty.all(const Color(0xfffffff1)),
437+
overlayColor: MaterialStateProperty.all(const Color(0xfffffff2)),
438+
splashRadius: 3.0,
439+
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
440+
visualDensity: const VisualDensity(vertical: 1.0, horizontal: 1.0),
441+
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(4.0))),
442+
side: const BorderSide(width: 4.0),
443+
);
444+
final CheckboxThemeData themeB = CheckboxThemeData(
445+
fillColor: MaterialStateProperty.all(const Color(0xfffffff3)),
446+
checkColor: MaterialStateProperty.all(const Color(0xfffffff4)),
447+
overlayColor: MaterialStateProperty.all(const Color(0xfffffff5)),
448+
splashRadius: 9.0,
449+
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
450+
visualDensity: const VisualDensity(vertical: 2.0, horizontal: 2.0),
451+
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(1.0))),
452+
side: const BorderSide(width: 3.0),
453+
);
454+
final CheckboxThemeData lerped = CheckboxThemeData.lerp(themeA, themeB, 0.5);
455+
456+
expect(lerped.fillColor!.resolve(<MaterialState>{}), const Color(0xfffffff1));
457+
expect(lerped.checkColor!.resolve(<MaterialState>{}), const Color(0xfffffff2));
458+
expect(lerped.overlayColor!.resolve(<MaterialState>{}), const Color(0xfffffff3));
459+
expect(lerped.splashRadius, 6);
460+
expect(lerped.materialTapTargetSize, MaterialTapTargetSize.shrinkWrap);
461+
expect(lerped.visualDensity, const VisualDensity(vertical: 2.0, horizontal: 2.0));
462+
expect(lerped.shape, const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(2.5))));
463+
expect(lerped.side, const BorderSide(width: 3.5));
464+
});
394465
}
395466

396467
Future<void> _pointGestureToCheckbox(WidgetTester tester) async {

0 commit comments

Comments
 (0)