Skip to content

Commit e8cbd44

Browse files
authored
Added Badge.isLabelVisible flag (#115292)
1 parent 1b23ad6 commit e8cbd44

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class Badge extends StatelessWidget {
3636
this.padding,
3737
this.alignment,
3838
this.label,
39+
this.isLabelVisible = true,
3940
this.child,
4041
});
4142

@@ -102,6 +103,12 @@ class Badge extends StatelessWidget {
102103
/// this is a [StadiumBorder] shaped "large" badge with height [largeSize].
103104
final Widget? label;
104105

106+
/// If false, the badge's [label] is not included.
107+
///
108+
/// This flag is true by default. It's intended to make it convenient
109+
/// to create a badge that's only shown under certain conditions.
110+
final bool isLabelVisible;
111+
105112
/// The widget that the badge is stacked on top of.
106113
///
107114
/// Typically this is an default sized [Icon] that's part of a
@@ -110,6 +117,10 @@ class Badge extends StatelessWidget {
110117

111118
@override
112119
Widget build(BuildContext context) {
120+
if (!isLabelVisible) {
121+
return child ?? const SizedBox();
122+
}
123+
113124
final BadgeThemeData badgeTheme = BadgeTheme.of(context);
114125
final BadgeThemeData defaults = _BadgeDefaultsM3(context);
115126
final double effectiveSmallSize = smallSize ?? badgeTheme.smallSize ?? defaults.smallSize!;

packages/flutter/test/material/badge_test.dart

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ void main() {
2020
alignment: Alignment.topLeft,
2121
child: Builder(
2222
builder: (BuildContext context) {
23-
// theme.textTtheme is updated when the MaterialApp is built.
23+
// theme.textTheme is updated when the MaterialApp is built.
2424
theme = Theme.of(context);
2525
return const Badge(
2626
label: Text('0'),
@@ -71,7 +71,7 @@ void main() {
7171
alignment: Alignment.topLeft,
7272
child: Builder(
7373
builder: (BuildContext context) {
74-
// theme.textTtheme is updated when the MaterialApp is built.
74+
// theme.textTheme is updated when the MaterialApp is built.
7575
theme = Theme.of(context);
7676
return const Badge(
7777
label: Text('0'),
@@ -202,5 +202,27 @@ void main() {
202202
expect(tester.renderObject(find.byType(Badge)), paints..rrect(color: black));
203203
});
204204

205+
testWidgets('isLabelVisible', (WidgetTester tester) async {
206+
await tester.pumpWidget(
207+
MaterialApp(
208+
theme: ThemeData.light(useMaterial3: true),
209+
home: const Align(
210+
alignment: Alignment.topLeft,
211+
child: Badge(
212+
label: Text('0'),
213+
isLabelVisible: false,
214+
child: Icon(Icons.add),
215+
),
216+
),
217+
),
218+
);
219+
220+
expect(find.text('0'), findsNothing);
221+
expect(find.byType(Icon), findsOneWidget);
205222

223+
expect(tester.getSize(find.byType(Badge)), const Size(24, 24)); // default Icon size
224+
expect(tester.getTopLeft(find.byType(Badge)), Offset.zero);
225+
final RenderBox box = tester.renderObject(find.byType(Badge));
226+
expect(box, isNot(paints..rrect()));
227+
});
206228
}

0 commit comments

Comments
 (0)