diff --git a/lib/magic_starter.dart b/lib/magic_starter.dart index ad4c96b..cc117c1 100644 --- a/lib/magic_starter.dart +++ b/lib/magic_starter.dart @@ -45,4 +45,5 @@ export 'src/ui/widgets/magic_starter_two_factor_modal.dart'; export 'src/ui/widgets/magic_starter_timezone_select.dart'; export 'src/ui/widgets/magic_starter_page_header.dart'; export 'src/ui/widgets/magic_starter_dialog_shell.dart'; +export 'src/ui/widgets/magic_starter_hide_bottom_nav.dart'; export 'src/ui/views/teams/magic_starter_team_invitation_accept_view.dart'; diff --git a/lib/src/ui/layouts/magic_starter_app_layout.dart b/lib/src/ui/layouts/magic_starter_app_layout.dart index 8bf74a4..8c226e3 100644 --- a/lib/src/ui/layouts/magic_starter_app_layout.dart +++ b/lib/src/ui/layouts/magic_starter_app_layout.dart @@ -8,6 +8,7 @@ import '../../magic_starter_manager.dart'; import '../widgets/magic_starter_team_selector.dart'; import '../widgets/magic_starter_user_profile_dropdown.dart'; import 'package:magic_notifications/magic_notifications.dart'; +import '../widgets/magic_starter_hide_bottom_nav.dart'; import '../widgets/magic_starter_notification_dropdown.dart'; /// Default App Layout for Magic Starter. @@ -132,7 +133,9 @@ class _MagicStarterAppLayoutState extends State { ], ), ), - bottomNavigationBar: (!isDesktop && hasBottomNav) + bottomNavigationBar: (!isDesktop && + hasBottomNav && + !MagicStarterHideBottomNav.of(context)) ? _buildBottomNav(context, currentPath) : null, ); diff --git a/lib/src/ui/widgets/magic_starter_hide_bottom_nav.dart b/lib/src/ui/widgets/magic_starter_hide_bottom_nav.dart new file mode 100644 index 0000000..d6caee1 --- /dev/null +++ b/lib/src/ui/widgets/magic_starter_hide_bottom_nav.dart @@ -0,0 +1,41 @@ +import 'package:flutter/widgets.dart'; + +/// Signals to `MagicStarterAppLayout` that the bottom navigation bar +/// should be hidden for routes nested under this widget. +/// +/// Wrap a layout with this widget to suppress the mobile bottom navigation +/// bar for specific route groups (e.g., fullscreen views, media players, +/// chat screens). +/// +/// ## Usage +/// +/// ```dart +/// MagicRoute.group( +/// layout: (child) => MagicStarterHideBottomNav( +/// child: MagicStarter.view.makeLayout('layout.app', child: child), +/// ), +/// layoutId: 'app.fullscreen', +/// routes: () { ... }, +/// ); +/// ``` +/// +/// In your layout's `build` method, check whether to show bottom nav: +/// +/// ```dart +/// if (!MagicStarterHideBottomNav.of(context)) _buildBottomNav(), +/// ``` +class MagicStarterHideBottomNav extends InheritedWidget { + /// Creates a [MagicStarterHideBottomNav] that hides bottom navigation + /// for its subtree. + const MagicStarterHideBottomNav({super.key, required super.child}); + + /// Returns `true` if a [MagicStarterHideBottomNav] exists above [context]. + static bool of(BuildContext context) { + return context + .dependOnInheritedWidgetOfExactType() != + null; + } + + @override + bool updateShouldNotify(MagicStarterHideBottomNav oldWidget) => false; +}