Unverified Commit 476e2d51 authored by Taha Tesser's avatar Taha Tesser Committed by GitHub

Add `Badge` widget to `NavigationBar` and `NavigationRail` examples (#129834)

fixes [Showcase `Badge` widget in `NavigationBar` and `NavigationRail` examples
](https://github.com/flutter/flutter/issues/129832)

| Preview | Preview | Preview |
| --------------- | --------------- | --------------- |
| <img src="https://github.com/flutter/flutter/assets/48603081/808c9577-c6b4-465f-b9fe-100d422dd408" /> | <img src="https://github.com/flutter/flutter/assets/48603081/c9b3ee03-56d7-4220-94cf-06e235631714" /> | <img src="https://github.com/flutter/flutter/assets/48603081/43fab47b-25e8-4412-92d2-6d4868e43ff8"  /> |
parent eaf01a9a
...@@ -13,7 +13,10 @@ class NavigationBarApp extends StatelessWidget { ...@@ -13,7 +13,10 @@ class NavigationBarApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return const MaterialApp(home: NavigationExample()); return MaterialApp(
theme: ThemeData(useMaterial3: true),
home: const NavigationExample(),
);
} }
} }
...@@ -29,6 +32,7 @@ class _NavigationExampleState extends State<NavigationExample> { ...@@ -29,6 +32,7 @@ class _NavigationExampleState extends State<NavigationExample> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context);
return Scaffold( return Scaffold(
bottomNavigationBar: NavigationBar( bottomNavigationBar: NavigationBar(
onDestinationSelected: (int index) { onDestinationSelected: (int index) {
...@@ -36,7 +40,7 @@ class _NavigationExampleState extends State<NavigationExample> { ...@@ -36,7 +40,7 @@ class _NavigationExampleState extends State<NavigationExample> {
currentPageIndex = index; currentPageIndex = index;
}); });
}, },
indicatorColor: Colors.amber[800], indicatorColor: Colors.amber,
selectedIndex: currentPageIndex, selectedIndex: currentPageIndex,
destinations: const <Widget>[ destinations: const <Widget>[
NavigationDestination( NavigationDestination(
...@@ -45,31 +49,94 @@ class _NavigationExampleState extends State<NavigationExample> { ...@@ -45,31 +49,94 @@ class _NavigationExampleState extends State<NavigationExample> {
label: 'Home', label: 'Home',
), ),
NavigationDestination( NavigationDestination(
icon: Icon(Icons.business), icon: Badge(child: Icon(Icons.notifications_sharp)),
label: 'Business', label: 'Notifications',
), ),
NavigationDestination( NavigationDestination(
selectedIcon: Icon(Icons.school), icon: Badge(
icon: Icon(Icons.school_outlined), label: Text('2'),
label: 'School', child: Icon(Icons.messenger_sharp),
),
label: 'Messages',
), ),
], ],
), ),
body: <Widget>[ body: <Widget>[
Container( /// Home page
color: Colors.red, Card(
alignment: Alignment.center, shadowColor: Colors.transparent,
child: const Text('Page 1'), margin: const EdgeInsets.all(8.0),
), child: SizedBox.expand(
Container( child: Center(
color: Colors.green, child: Text(
alignment: Alignment.center, 'Home page',
child: const Text('Page 2'), style: theme.textTheme.titleLarge,
), ),
Container( ),
color: Colors.blue, ),
alignment: Alignment.center, ),
child: const Text('Page 3'), /// Notifications page
const Padding(
padding: EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
Card(
child: ListTile(
leading: Icon(Icons.notifications_sharp),
title: Text('Notification 1'),
subtitle: Text('This is a notification'),
),
),
Card(
child: ListTile(
leading: Icon(Icons.notifications_sharp),
title: Text('Notification 2'),
subtitle: Text('This is a notification'),
),
),
],
),
),
/// Messages page
ListView.builder(
reverse: true,
itemCount: 2,
itemBuilder: (BuildContext context, int index) {
if (index == 0) {
return Align(
alignment: Alignment.centerRight,
child: Container(
margin: const EdgeInsets.all(8.0),
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: theme.colorScheme.primary,
borderRadius: BorderRadius.circular(8.0),
),
child: Text(
'Hello',
style: theme.textTheme.bodyLarge!
.copyWith(color: theme.colorScheme.onPrimary),
),
),
);
}
return Align(
alignment: Alignment.centerLeft,
child: Container(
margin: const EdgeInsets.all(8.0),
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: theme.colorScheme.primary,
borderRadius: BorderRadius.circular(8.0),
),
child: Text(
'Hi!',
style: theme.textTheme.bodyLarge!
.copyWith(color: theme.colorScheme.onPrimary),
),
),
);
},
), ),
][currentPageIndex], ][currentPageIndex],
); );
......
...@@ -14,7 +14,7 @@ class NavigationRailExampleApp extends StatelessWidget { ...@@ -14,7 +14,7 @@ class NavigationRailExampleApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return MaterialApp(
theme: ThemeData(colorSchemeSeed: const Color(0xff6750a4), useMaterial3: true), theme: ThemeData(useMaterial3: true),
home: const NavRailExample(), home: const NavRailExample(),
); );
} }
...@@ -73,13 +73,19 @@ class _NavRailExampleState extends State<NavRailExample> { ...@@ -73,13 +73,19 @@ class _NavRailExampleState extends State<NavRailExample> {
label: Text('First'), label: Text('First'),
), ),
NavigationRailDestination( NavigationRailDestination(
icon: Icon(Icons.bookmark_border), icon: Badge(child: Icon(Icons.bookmark_border)),
selectedIcon: Icon(Icons.book), selectedIcon: Badge(child: Icon(Icons.book)),
label: Text('Second'), label: Text('Second'),
), ),
NavigationRailDestination( NavigationRailDestination(
icon: Icon(Icons.star_border), icon: Badge(
selectedIcon: Icon(Icons.star), label: Text('4'),
child: Icon(Icons.star_border),
),
selectedIcon: Badge(
label: Text('4'),
child: Icon(Icons.star),
),
label: Text('Third'), label: Text('Third'),
), ),
], ],
......
...@@ -17,20 +17,36 @@ void main() { ...@@ -17,20 +17,36 @@ void main() {
/// NavigationDestinations must be rendered /// NavigationDestinations must be rendered
expect(find.text('Home'), findsOneWidget); expect(find.text('Home'), findsOneWidget);
expect(find.text('Business'), findsOneWidget); expect(find.text('Notifications'), findsOneWidget);
expect(find.text('School'), findsOneWidget); expect(find.text('Messages'), findsOneWidget);
/// initial index must be zero /// Test notification badge.
final Badge notificationBadge = tester.firstWidget(find.ancestor(
of: find.byIcon(Icons.notifications_sharp),
matching: find.byType(Badge),
));
expect(notificationBadge.label, null);
/// Test messages badge.
final Badge messagesBadge = tester.firstWidget(find.ancestor(
of: find.byIcon(Icons.messenger_sharp),
matching: find.byType(Badge),
));
expect(messagesBadge.label, isNotNull);
/// Initial index must be zero
expect(navigationBarWidget.selectedIndex, 0); expect(navigationBarWidget.selectedIndex, 0);
expect(find.text('Home page'), findsOneWidget);
/// switch to second tab /// Switch to second tab
await tester.tap(find.text('Business')); await tester.tap(find.text('Notifications'));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.text('Page 2'), findsOneWidget); expect(find.text('This is a notification'), findsNWidgets(2));
/// switch to third tab /// Switch to third tab
await tester.tap(find.text('School')); await tester.tap(find.text('Messages'));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.text('Page 3'), findsOneWidget); expect(find.text('Hi!'), findsOneWidget);
expect(find.text('Hello'), findsOneWidget);
}); });
} }
...@@ -94,4 +94,24 @@ void main() { ...@@ -94,4 +94,24 @@ void main() {
expect(find.byType(FloatingActionButton), findsOneWidget); expect(find.byType(FloatingActionButton), findsOneWidget);
expect(find.byType(IconButton), findsOneWidget); expect(find.byType(IconButton), findsOneWidget);
}); });
testWidgets('Destinations have badge', (WidgetTester tester) async {
await tester.pumpWidget(
const example.NavigationRailExampleApp(),
);
// Test badge wthout label.
final Badge notificationBadge = tester.firstWidget(find.ancestor(
of: find.byIcon(Icons.bookmark_border),
matching: find.byType(Badge),
));
expect(notificationBadge.label, null);
// Test badge with label.
final Badge messagesBadge = tester.firstWidget(find.ancestor(
of: find.byIcon(Icons.star_border),
matching: find.byType(Badge),
));
expect(messagesBadge.label, isNotNull);
});
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment