diff --git a/dev/tools/gen_defaults/lib/checkbox_template.dart b/dev/tools/gen_defaults/lib/checkbox_template.dart index b8a70f9b3c..41c02a449a 100644 --- a/dev/tools/gen_defaults/lib/checkbox_template.dart +++ b/dev/tools/gen_defaults/lib/checkbox_template.dart @@ -110,6 +110,11 @@ class _${blockName}DefaultsM3 extends CheckboxThemeData { @override VisualDensity get visualDensity => _theme.visualDensity; + + @override + OutlinedBorder get shape => RoundedRectangleBorder( + borderRadius: BorderRadius.circular(${tokens['md.comp.checkbox.unselected.outline.width']}), + ); } '''; } diff --git a/packages/flutter/lib/src/material/checkbox.dart b/packages/flutter/lib/src/material/checkbox.dart index 189b3f1909..ccf0086c6a 100644 --- a/packages/flutter/lib/src/material/checkbox.dart +++ b/packages/flutter/lib/src/material/checkbox.dart @@ -305,7 +305,7 @@ class Checkbox extends StatefulWidget { /// /// If this property is null then [CheckboxThemeData.shape] of [ThemeData.checkboxTheme] /// is used. If that's null then the shape will be a [RoundedRectangleBorder] - /// with a circular corner radius of 1.0. + /// with a circular corner radius of 1.0 in Material 2, and 2.0 in Material 3. final OutlinedBorder? shape; /// {@template flutter.material.checkbox.side} @@ -522,9 +522,7 @@ class _CheckboxState extends State with TickerProviderStateMixin, Togg ..checkColor = effectiveCheckColor ..value = value ..previousValue = _previousValue - ..shape = widget.shape ?? checkboxTheme.shape ?? const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(1.0)), - ) + ..shape = widget.shape ?? checkboxTheme.shape ?? defaults.shape! ..side = _resolveSide(widget.side) ?? _resolveSide(checkboxTheme.side), ), ); @@ -759,6 +757,11 @@ class _CheckboxDefaultsM2 extends CheckboxThemeData { @override VisualDensity get visualDensity => _theme.visualDensity; + + @override + OutlinedBorder get shape => const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(1.0)), + ); } // BEGIN GENERATED TOKEN PROPERTIES - Checkbox @@ -869,6 +872,11 @@ class _CheckboxDefaultsM3 extends CheckboxThemeData { @override VisualDensity get visualDensity => _theme.visualDensity; + + @override + OutlinedBorder get shape => RoundedRectangleBorder( + borderRadius: BorderRadius.circular(2.0), + ); } // END GENERATED TOKEN PROPERTIES - Checkbox diff --git a/packages/flutter/test/material/checkbox_test.dart b/packages/flutter/test/material/checkbox_test.dart index 131627c06e..176f115f9e 100644 --- a/packages/flutter/test/material/checkbox_test.dart +++ b/packages/flutter/test/material/checkbox_test.dart @@ -1698,7 +1698,7 @@ void main() { paints ..drrect( color: borderColor, - outer: RRect.fromLTRBR(15, 15, 33, 33, const Radius.circular(1)), + outer: RRect.fromLTRBR(15, 15, 33, 33, const Radius.circular(2)), inner: RRect.fromLTRBR(19, 19, 29, 29, Radius.zero), ), ); @@ -1735,6 +1735,41 @@ void main() { await gestureLongPress.up(); await tester.pump(); }); + + testWidgets('Checkbox has correct default shape - M3', (WidgetTester tester) async { + final ThemeData themeData = ThemeData(useMaterial3: true); + + Widget buildApp() { + return MaterialApp( + theme: themeData, + home: Material( + child: Center( + child: StatefulBuilder(builder: (BuildContext context, StateSetter setState) { + return Checkbox( + value: false, + onChanged: (bool? newValue) {}, + + ); + }), + ), + ), + ); + } + + await tester.pumpWidget(buildApp()); + await tester.pumpAndSettle(); + + final OutlinedBorder? expectedShape = themeData.checkboxTheme.shape; + expect(tester.widget(find.byType(Checkbox)).shape, expectedShape); + expect( + Material.of(tester.element(find.byType(Checkbox))), + paints + ..drrect( + outer: RRect.fromLTRBR(15.0, 15.0, 33.0, 33.0, const Radius.circular(2)), + inner: RRect.fromLTRBR(17.0, 17.0, 31.0, 31.0, Radius.zero), + ), + ); + }); } class _SelectedGrabMouseCursor extends MaterialStateMouseCursor {