Skip to content

Commit 612a782

Browse files
home [nfc]: Factor bottom nav into its own widget
Co-authored-by: MritunjayTiwari14 <[email protected]>
1 parent 2f861d6 commit 612a782

File tree

1 file changed

+51
-40
lines changed

1 file changed

+51
-40
lines changed

lib/widgets/home.dart

Lines changed: 51 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -87,71 +87,82 @@ class _HomePageState extends State<HomePage> {
8787

8888
@override
8989
Widget build(BuildContext context) {
90-
final zulipLocalizations = ZulipLocalizations.of(context);
91-
9290
const pageBodies = [
9391
(_HomePageTab.inbox, InboxPageBody()),
9492
(_HomePageTab.channels, SubscriptionListPageBody()),
9593
// TODO(#1094): Users
9694
(_HomePageTab.directMessages, RecentDmConversationsPageBody()),
9795
];
9896

99-
_NavigationBarButton button(_HomePageTab tab, IconData icon, String label) {
100-
return _NavigationBarButton(icon: icon,
101-
selected: _tab.value == tab,
102-
onPressed: () {
103-
_tab.value = tab;
104-
},
105-
label: label);
106-
}
97+
return Scaffold(
98+
appBar: ZulipAppBar(titleSpacing: 16,
99+
title: Text(_currentTabTitle)),
100+
body: Stack(
101+
children: [
102+
for (final (tab, body) in pageBodies)
103+
// TODO(#535): Decide if we find it helpful to use something like
104+
// [SemanticsProperties.namesRoute] to structure this UI better
105+
// for screen-reader software.
106+
Offstage(offstage: tab != _tab.value, child: body),
107+
]),
108+
bottomNavigationBar: _BottomNavBar(tabNotifier: _tab));
109+
}
110+
}
111+
112+
class _BottomNavBar extends StatelessWidget {
113+
const _BottomNavBar({required this.tabNotifier});
114+
115+
final ValueNotifier<_HomePageTab> tabNotifier;
116+
117+
_NavigationBarButton _button(_HomePageTab tab, IconData icon, String label) {
118+
return _NavigationBarButton(icon: icon,
119+
selected: tabNotifier.value == tab,
120+
onPressed: () {
121+
tabNotifier.value = tab;
122+
},
123+
label: label);
124+
}
125+
126+
@override
127+
Widget build(BuildContext context) {
128+
final designVariables = DesignVariables.of(context);
129+
final zulipLocalizations = ZulipLocalizations.of(context);
107130

108131
// TODO(a11y): add tooltips for these buttons
109132
final navigationBarButtons = [
110-
button(_HomePageTab.inbox, ZulipIcons.inbox,
133+
_button(_HomePageTab.inbox, ZulipIcons.inbox,
111134
zulipLocalizations.inboxPageTitle),
112135
_NavigationBarButton( icon: ZulipIcons.message_feed,
113136
selected: false,
114137
onPressed: () => Navigator.push(context,
115138
MessageListPage.buildRoute(context: context,
116139
narrow: const CombinedFeedNarrow())),
117140
label: zulipLocalizations.combinedFeedPageTitle),
118-
button(_HomePageTab.channels, ZulipIcons.hash_italic,
141+
_button(_HomePageTab.channels, ZulipIcons.hash_italic,
119142
zulipLocalizations.channelsPageTitle),
120143
// TODO(#1094): Users
121-
button(_HomePageTab.directMessages, ZulipIcons.two_person,
144+
_button(_HomePageTab.directMessages, ZulipIcons.two_person,
122145
zulipLocalizations.recentDmConversationsPageTitle),
123146
_NavigationBarButton( icon: ZulipIcons.menu,
124147
selected: false,
125-
onPressed: () => _showMainMenu(context, tabNotifier: _tab),
148+
onPressed: () => _showMainMenu(context, tabNotifier: tabNotifier),
126149
label: zulipLocalizations.navBarMenuLabel),
127150
];
128151

129-
final designVariables = DesignVariables.of(context);
130-
return Scaffold(
131-
appBar: ZulipAppBar(titleSpacing: 16,
132-
title: Text(_currentTabTitle)),
133-
body: Stack(
134-
children: [
135-
for (final (tab, body) in pageBodies)
136-
// TODO(#535): Decide if we find it helpful to use something like
137-
// [SemanticsProperties.namesRoute] to structure this UI better
138-
// for screen-reader software.
139-
Offstage(offstage: tab != _tab.value, child: body),
140-
]),
141-
bottomNavigationBar: DecoratedBox(
142-
decoration: BoxDecoration(
143-
border: Border(top: BorderSide(color: designVariables.borderBar)),
144-
color: designVariables.bgBotBar),
145-
child: SafeArea(
146-
child: ConstrainedBox(
147-
// TODO(design): determine a suitable max width for bottom nav bar
148-
constraints: const BoxConstraints(maxWidth: 600, minHeight: 48),
149-
child: Row(
150-
crossAxisAlignment: CrossAxisAlignment.start,
151-
children: [
152-
for (final navigationBarButton in navigationBarButtons)
153-
Expanded(child: navigationBarButton),
154-
])))));
152+
return DecoratedBox(
153+
decoration: BoxDecoration(
154+
border: Border(top: BorderSide(color: designVariables.borderBar)),
155+
color: designVariables.bgBotBar),
156+
child: SafeArea(
157+
child: ConstrainedBox(
158+
// TODO(design): determine a suitable max width for bottom nav bar
159+
constraints: const BoxConstraints(maxWidth: 600, minHeight: 48),
160+
child: Row(
161+
crossAxisAlignment: CrossAxisAlignment.start,
162+
children: [
163+
for (final navigationBarButton in navigationBarButtons)
164+
Expanded(child: navigationBarButton),
165+
]))));
155166
}
156167
}
157168

0 commit comments

Comments
 (0)