@@ -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