Reland Added Badge.count constructor (#115566)
This commit is contained in:
parent
537f89ca0e
commit
70b7445cba
@ -40,6 +40,25 @@ class Badge extends StatelessWidget {
|
||||
this.child,
|
||||
});
|
||||
|
||||
/// Convenience constructor for creating a badge with a numeric
|
||||
/// label with 1-3 digits based on [count].
|
||||
///
|
||||
/// Initializes [label] with a [Text] widget that contains [count].
|
||||
/// If [count] is greater than 999, then the label is '999+'.
|
||||
Badge.count({
|
||||
super.key,
|
||||
this.backgroundColor,
|
||||
this.textColor,
|
||||
this.smallSize,
|
||||
this.largeSize,
|
||||
this.textStyle,
|
||||
this.padding,
|
||||
this.alignment,
|
||||
required int count,
|
||||
this.isLabelVisible = true,
|
||||
this.child,
|
||||
}) : label = Text(count > 999 ? '999+' : '$count');
|
||||
|
||||
/// The badge's fill color.
|
||||
///
|
||||
/// Defaults to the [BadgeTheme]'s background color, or
|
||||
|
@ -111,6 +111,63 @@ void main() {
|
||||
expect(box, paints..rrect(rrect: RRect.fromLTRBR(-8, -4, 12, 12, const Radius.circular(8)), color: theme.colorScheme.error));
|
||||
});
|
||||
|
||||
// Essentially the same as 'Large Badge defaults'
|
||||
testWidgets('Badge.count', (WidgetTester tester) async {
|
||||
late final ThemeData theme;
|
||||
|
||||
Widget buildFrame(int count) {
|
||||
return MaterialApp(
|
||||
theme: ThemeData.light(useMaterial3: true),
|
||||
home: Align(
|
||||
alignment: Alignment.topLeft,
|
||||
child: Builder(
|
||||
builder: (BuildContext context) {
|
||||
// theme.textTheme is updated when the MaterialApp is built.
|
||||
if (count == 0) {
|
||||
theme = Theme.of(context);
|
||||
}
|
||||
return Badge.count(
|
||||
count: count,
|
||||
child: const Icon(Icons.add),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
await tester.pumpWidget(buildFrame(0));
|
||||
|
||||
expect(
|
||||
tester.renderObject<RenderParagraph>(find.text('0')).text.style,
|
||||
theme.textTheme.labelSmall!.copyWith(color: theme.colorScheme.onError),
|
||||
);
|
||||
|
||||
// default badge alignment = AlignmentDirectional(12, -4)
|
||||
// default padding = EdgeInsets.symmetric(horizontal: 4)
|
||||
// default largeSize = 16
|
||||
// '0'.width = 12
|
||||
// icon.width = 24
|
||||
|
||||
expect(tester.getSize(find.byType(Badge)), const Size(24, 24)); // default Icon size
|
||||
expect(tester.getTopLeft(find.byType(Badge)), Offset.zero);
|
||||
|
||||
// x = alignment.start + padding.left
|
||||
// y = alignment.top
|
||||
expect(tester.getTopLeft(find.text('0')), const Offset(16, -4));
|
||||
|
||||
final RenderBox box = tester.renderObject(find.byType(Badge));
|
||||
// '0'.width = 12
|
||||
// L = alignment.start
|
||||
// T = alignment.top
|
||||
// R = L + '0'.width + padding.width
|
||||
// B = T + largeSize, R = largeSize/2
|
||||
expect(box, paints..rrect(rrect: RRect.fromLTRBR(12, -4, 32, 12, const Radius.circular(8)), color: theme.colorScheme.error));
|
||||
|
||||
await tester.pumpWidget(buildFrame(1000));
|
||||
expect(find.text('999+'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('Small Badge defaults', (WidgetTester tester) async {
|
||||
final ThemeData theme = ThemeData.light(useMaterial3: true);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user