diff --git a/lib/config/app_screens.dart b/lib/config/app_screens.dart index 4f9a97d..2326e31 100644 --- a/lib/config/app_screens.dart +++ b/lib/config/app_screens.dart @@ -1,15 +1,24 @@ import 'package:flutter/material.dart'; +import 'package:adguard_home_manager/screens/clients/clients.dart'; +import 'package:adguard_home_manager/screens/connect/connect.dart'; +import 'package:adguard_home_manager/screens/filters/filters.dart'; +import 'package:adguard_home_manager/screens/home/home.dart'; +import 'package:adguard_home_manager/screens/logs/logs.dart'; +import 'package:adguard_home_manager/screens/settings/settings.dart'; + import 'package:adguard_home_manager/models/app_screen.dart'; List screensSelectServer = [ const AppScreen( name: "connect", icon: Icons.link_rounded, + child: Connect() ), const AppScreen( name: "settings", icon: Icons.settings_rounded, + child: Settings() ) ]; @@ -17,21 +26,26 @@ List screensServerConnected = [ const AppScreen( name: "home", icon: Icons.home_rounded, + child: Home() ), const AppScreen( name: "clients", icon: Icons.devices, + child: Clients() ), const AppScreen( name: "logs", icon: Icons.list_alt_rounded, + child: Logs() ), const AppScreen( name: "filters", icon: Icons.shield_rounded, + child: Filters() ), const AppScreen( name: "settings", icon: Icons.settings_rounded, + child: Settings() ) ]; \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 1548e4a..f34459f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,11 +16,12 @@ import 'package:window_size/window_size.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:adguard_home_manager/widgets/layout.dart'; import 'package:adguard_home_manager/widgets/menu_bar.dart'; + import 'package:adguard_home_manager/functions/check_app_updates.dart'; import 'package:adguard_home_manager/functions/open_url.dart'; import 'package:adguard_home_manager/widgets/update_modal.dart'; -import 'package:adguard_home_manager/routes/router.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/clients_provider.dart'; @@ -244,7 +245,7 @@ class _MainState extends State
with WidgetsBindingObserver { : Brightness.light, ), child: DynamicColorBuilder( - builder: (lightDynamic, darkDynamic) => MaterialApp.router( + builder: (lightDynamic, darkDynamic) => MaterialApp( title: 'AdGuard Home Manager', theme: appConfigProvider.androidDeviceInfo != null && appConfigProvider.androidDeviceInfo!.version.sdkInt >= 31 ? appConfigProvider.useDynamicColor == true @@ -285,7 +286,7 @@ class _MainState extends State
with WidgetsBindingObserver { ), ); }, - routerConfig: goRouter, + home: Layout(), ), ), ); diff --git a/lib/models/app_screen.dart b/lib/models/app_screen.dart index 1e377eb..4412022 100644 --- a/lib/models/app_screen.dart +++ b/lib/models/app_screen.dart @@ -5,11 +5,13 @@ class AppScreen { final IconData icon; final PreferredSizeWidget? appBar; final Widget? fab; + final Widget child; const AppScreen({ required this.name, required this.icon, this.appBar, - this.fab + this.fab, + required this.child, }); } \ No newline at end of file diff --git a/lib/routes/router.dart b/lib/routes/router.dart deleted file mode 100644 index 9b1cfba..0000000 --- a/lib/routes/router.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:go_router/go_router.dart'; -import 'package:provider/provider.dart'; - -import 'package:adguard_home_manager/routes/router_globals.dart'; -import 'package:adguard_home_manager/routes/routes.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; -import 'package:adguard_home_manager/constants/routes_names.dart'; - -final goRouter = GoRouter( - navigatorKey: rootNavigatorKey, - redirect: (context, state) { - final serversProvider = Provider.of(context, listen: false); - if (serversProvider.selectedServer == null) { - return RoutesNames.connect; - } - return null; - }, - initialLocation: RoutesNames.home, - routes: routes, -); \ No newline at end of file diff --git a/lib/routes/router_globals.dart b/lib/routes/router_globals.dart deleted file mode 100644 index f78c1a7..0000000 --- a/lib/routes/router_globals.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/widgets.dart'; - -final GlobalKey rootNavigatorKey = GlobalKey(); -final GlobalKey connectNavigatorKey = GlobalKey(); -final GlobalKey homeNavigatorKey = GlobalKey(); -final GlobalKey clientsNavigatorKey = GlobalKey(); -final GlobalKey logsNavigatorKey = GlobalKey(); -final GlobalKey filtersNavigatorKey = GlobalKey(); -final GlobalKey settingsNavigatorKey = GlobalKey(); -final GlobalKey settingsListNavigatorKey = GlobalKey(); \ No newline at end of file diff --git a/lib/routes/routes.dart b/lib/routes/routes.dart deleted file mode 100644 index 9a79603..0000000 --- a/lib/routes/routes.dart +++ /dev/null @@ -1,129 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; - -import 'package:adguard_home_manager/screens/home/home.dart'; -import 'package:adguard_home_manager/screens/clients/clients.dart'; -import 'package:adguard_home_manager/screens/connect/connect.dart'; -import 'package:adguard_home_manager/screens/filters/filters.dart'; -import 'package:adguard_home_manager/screens/logs/logs.dart'; -import 'package:adguard_home_manager/screens/settings/settings.dart'; -import 'package:adguard_home_manager/widgets/layout.dart'; - -import 'package:adguard_home_manager/functions/desktop_mode.dart'; -import 'package:adguard_home_manager/routes/router_globals.dart'; -import 'package:adguard_home_manager/constants/routes_names.dart'; - -final List routes = [ - GoRoute( - path: "/", - redirect: (context, state) => RoutesNames.home, - ), - StatefulShellRoute.indexedStack( - builder: (context, state, navigationShell) => Layout( - navigationShell: navigationShell - ), - branches: [ - StatefulShellBranch( - navigatorKey: homeNavigatorKey, - routes: [ - GoRoute( - parentNavigatorKey: homeNavigatorKey, - path: RoutesNames.home, - pageBuilder: (context, state) { - if (isDesktop(MediaQuery.of(context).size.width)) { - return const NoTransitionPage(child: Home()); - } - else { - return const MaterialPage(child: Home()); - } - }, - ), - ] - ), - StatefulShellBranch( - navigatorKey: clientsNavigatorKey, - routes: [ - GoRoute( - parentNavigatorKey: clientsNavigatorKey, - path: RoutesNames.clients, - pageBuilder: (context, state) { - if (isDesktop(MediaQuery.of(context).size.width)) { - return const NoTransitionPage(child: Clients()); - } - else { - return const MaterialPage(child: Clients()); - } - }, - ) - ] - ), - StatefulShellBranch( - navigatorKey: logsNavigatorKey, - routes: [ - GoRoute( - parentNavigatorKey: logsNavigatorKey, - path: RoutesNames.logs, - pageBuilder: (context, state) { - if (isDesktop(MediaQuery.of(context).size.width)) { - return const NoTransitionPage(child: Logs()); - } - else { - return const MaterialPage(child: Logs()); - } - }, - ) - ] - ), - StatefulShellBranch( - navigatorKey: filtersNavigatorKey, - routes: [ - GoRoute( - parentNavigatorKey: filtersNavigatorKey, - path: RoutesNames.filters, - pageBuilder: (context, state) { - if (isDesktop(MediaQuery.of(context).size.width)) { - return const NoTransitionPage(child: Filters()); - } - else { - return const MaterialPage(child: Filters()); - } - }, - ) - ] - ), - StatefulShellBranch( - navigatorKey: settingsNavigatorKey, - routes: [ - GoRoute( - parentNavigatorKey: settingsNavigatorKey, - path: RoutesNames.settings, - pageBuilder: (context, state) { - if (isDesktop(MediaQuery.of(context).size.width)) { - return const NoTransitionPage(child: Settings()); - } - else { - return const MaterialPage(child: Settings()); - } - }, - ) - ] - ), - StatefulShellBranch( - navigatorKey: connectNavigatorKey, - routes: [ - GoRoute( - path: RoutesNames.connect, - pageBuilder: (context, state) { - if (isDesktop(MediaQuery.of(context).size.width)) { - return const NoTransitionPage(child: Connect()); - } - else { - return const MaterialPage(child: Connect()); - } - }, - ) - ] - ), - ] - ) -]; \ No newline at end of file diff --git a/lib/screens/clients/client/logs_list_client.dart b/lib/screens/clients/client/logs_list_client.dart index 5d8f6ed..9761e3f 100644 --- a/lib/screens/clients/client/logs_list_client.dart +++ b/lib/screens/clients/client/logs_list_client.dart @@ -212,12 +212,14 @@ class _LogsListClientState extends State { ) } else { - Navigator.push(context, MaterialPageRoute( - builder: (context) => LogDetailsScreen( - log: log, - dialog: false + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => LogDetailsScreen( + log: log, + dialog: false + ) ) - )) + ) } }, twoColumns: widget.splitView, diff --git a/lib/screens/clients/clients_lists.dart b/lib/screens/clients/clients_lists.dart index ec451bc..0e518ce 100644 --- a/lib/screens/clients/clients_lists.dart +++ b/lib/screens/clients/clients_lists.dart @@ -71,9 +71,11 @@ class _ClientsListsState extends State with TickerProviderStateMix SplitView.of(context).push(w); } else { - Navigator.push(context, MaterialPageRoute( - builder: (context) => w, - )); + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => w, + ) + ); } } @@ -89,9 +91,11 @@ class _ClientsListsState extends State with TickerProviderStateMix SplitView.of(context).push(w); } else { - Navigator.push(context, MaterialPageRoute( - builder: (context) => w, - )); + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => w, + ) + ); } } diff --git a/lib/screens/home/appbar.dart b/lib/screens/home/appbar.dart index 34893b6..365e606 100644 --- a/lib/screens/home/appbar.dart +++ b/lib/screens/home/appbar.dart @@ -1,10 +1,10 @@ -import 'package:adguard_home_manager/functions/desktop_mode.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/servers/servers.dart'; +import 'package:adguard_home_manager/functions/desktop_mode.dart'; import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/functions/open_url.dart'; diff --git a/lib/screens/logs/logs_list.dart b/lib/screens/logs/logs_list.dart index 6fd80e6..b04fe74 100644 --- a/lib/screens/logs/logs_list.dart +++ b/lib/screens/logs/logs_list.dart @@ -463,12 +463,14 @@ class _LogsListWidgetState extends State { isLogSelected: widget.selectedLog != null && widget.selectedLog == logsProvider.logsData!.data[index], onLogTap: (log) { if (!widget.twoColumns) { - Navigator.push(context, MaterialPageRoute( - builder: (context) => LogDetailsScreen( - log: log, - dialog: false, + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => LogDetailsScreen( + log: log, + dialog: false, + ) ) - )); + ); } widget.onLogSelected(log); }, diff --git a/lib/screens/settings/dhcp/dhcp.dart b/lib/screens/settings/dhcp/dhcp.dart index aa44414..c003ea2 100644 --- a/lib/screens/settings/dhcp/dhcp.dart +++ b/lib/screens/settings/dhcp/dhcp.dart @@ -705,12 +705,14 @@ class _DhcpScreenState extends State { color: Colors.transparent, child: InkWell( onTap: () { - Navigator.push(context, MaterialPageRoute( - builder: (context) => DhcpLeases( - items: dhcpProvider.dhcp!.dhcpStatus.leases, - staticLeases: false, + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => DhcpLeases( + items: dhcpProvider.dhcp!.dhcpStatus.leases, + staticLeases: false, + ) ) - )); + ); }, child: Container( padding: const EdgeInsets.all(16), @@ -738,12 +740,14 @@ class _DhcpScreenState extends State { color: Colors.transparent, child: InkWell( onTap: () { - Navigator.push(context, MaterialPageRoute( - builder: (context) => DhcpLeases( - items: dhcpProvider.dhcp!.dhcpStatus.staticLeases, - staticLeases: true, + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => DhcpLeases( + items: dhcpProvider.dhcp!.dhcpStatus.staticLeases, + staticLeases: true, + ) ) - )); + ); }, child: Container( padding: const EdgeInsets.all(16), @@ -781,12 +785,14 @@ class _DhcpScreenState extends State { ); } else { - Navigator.push(context, MaterialPageRoute( - builder: (context) => DhcpLeases( - items: dhcpProvider.dhcp!.dhcpStatus.leases, - staticLeases: false, + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => DhcpLeases( + items: dhcpProvider.dhcp!.dhcpStatus.leases, + staticLeases: false, + ) ) - )); + ); } }, child: Row( @@ -808,12 +814,14 @@ class _DhcpScreenState extends State { ); } else { - Navigator.push(context, MaterialPageRoute( - builder: (context) => DhcpLeases( - items: dhcpProvider.dhcp!.dhcpStatus.staticLeases, - staticLeases: true, + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => DhcpLeases( + items: dhcpProvider.dhcp!.dhcpStatus.staticLeases, + staticLeases: true, + ) ) - )); + ); } }, child: Row( diff --git a/lib/screens/settings/dns/dns.dart b/lib/screens/settings/dns/dns.dart index 7d0760b..1f74669 100644 --- a/lib/screens/settings/dns/dns.dart +++ b/lib/screens/settings/dns/dns.dart @@ -53,9 +53,11 @@ class _DnsSettingsState extends State { SplitView.of(context).push(w); } else { - Navigator.push(context, MaterialPageRoute( - builder: (context) => w - )); + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => w + ) + ); } } diff --git a/lib/screens/settings/general_settings/general_settings.dart b/lib/screens/settings/general_settings/general_settings.dart index cef6a8f..4625136 100644 --- a/lib/screens/settings/general_settings/general_settings.dart +++ b/lib/screens/settings/general_settings/general_settings.dart @@ -191,9 +191,11 @@ class _GeneralSettingsState extends State { icon: Icons.reorder_rounded, title: AppLocalizations.of(context)!.topItemsOrder, subtitle: AppLocalizations.of(context)!.topItemsOrderDescription, - onTap: () => Navigator.push(context, MaterialPageRoute( - builder: (context) => const ReorderableTopItemsHome() - )), + onTap: () => Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => const ReorderableTopItemsHome() + ) + ) ), CustomListTile( icon: Icons.donut_large_rounded, diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index 0f01b44..6a67d28 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -70,7 +70,7 @@ class Settings extends StatelessWidget { ); } } -class SettingsWidget extends StatelessWidget { +class SettingsWidget extends StatefulWidget { final bool twoColumns; const SettingsWidget({ @@ -78,6 +78,17 @@ class SettingsWidget extends StatelessWidget { required this.twoColumns, }) : super(key: key); + @override + State createState() => _SettingsWidgetState(); +} + +class _SettingsWidgetState extends State { + @override + void initState() { + Provider.of(context, listen: false).setSelectedSettingsScreen(screen: null); + super.initState(); + } + @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); @@ -86,7 +97,7 @@ class SettingsWidget extends StatelessWidget { final width = MediaQuery.of(context).size.width; - if (!twoColumns && appConfigProvider.selectedSettingsScreen != null) { + if (!widget.twoColumns && appConfigProvider.selectedSettingsScreen != null) { appConfigProvider.setSelectedSettingsScreen(screen: null); } @@ -98,7 +109,7 @@ class SettingsWidget extends StatelessWidget { required Widget screenToNavigate, required int thisItem }) { - if (twoColumns) { + if (widget.twoColumns) { return CustomSettingsTile( title: title, subtitle: subtitle, @@ -190,7 +201,7 @@ class SettingsWidget extends StatelessWidget { subtitle: AppLocalizations.of(context)!.dnsSettingsDescription, thisItem: 3, screenToNavigate: DnsSettings( - splitView: twoColumns, + splitView: widget.twoColumns, ), ), settingsTile( diff --git a/lib/widgets/layout.dart b/lib/widgets/layout.dart index 6104b6f..a7da996 100644 --- a/lib/widgets/layout.dart +++ b/lib/widgets/layout.dart @@ -1,18 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:animations/animations.dart'; import 'package:provider/provider.dart'; -import 'package:go_router/go_router.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/config/app_screens.dart'; import 'package:adguard_home_manager/config/sizes.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; class Layout extends StatefulWidget { - final StatefulNavigationShell navigationShell; - const Layout({ Key? key, - required this.navigationShell, }) : super(key: key); @override @@ -23,10 +21,7 @@ class _LayoutState extends State { bool _drawerExpanded = true; void _goBranch(int index) { - widget.navigationShell.goBranch( - index, - initialLocation: index == widget.navigationShell.currentIndex, - ); + Provider.of(context, listen: false).setSelectedScreen(index); } @override @@ -34,6 +29,11 @@ class _LayoutState extends State { final width = MediaQuery.of(context).size.width; final serversProvider = Provider.of(context); + final appConfigProvider = Provider.of(context); + + final screens = serversProvider.selectedServer != null + ? screensServerConnected + : screensSelectServer; String translatedName(String key) { switch (key) { @@ -93,8 +93,7 @@ class _LayoutState extends State { (s) => DrawerTile( icon: s.value.icon, title: translatedName(s.value.name), - isSelected: - widget.navigationShell.currentIndex == s.key, + isSelected: appConfigProvider.selectedScreen == s.key, onSelect: () => _goBranch(s.key), withoutTitle: !_drawerExpanded, ), @@ -104,8 +103,7 @@ class _LayoutState extends State { (s) => DrawerTile( icon: s.value.icon, title: translatedName(s.value.name), - isSelected: - widget.navigationShell.currentIndex == s.key, + isSelected: appConfigProvider.selectedScreen == s.key, onSelect: () => _goBranch(s.key), withoutTitle: !_drawerExpanded, ), @@ -114,7 +112,17 @@ class _LayoutState extends State { ), ), Expanded( - child: widget.navigationShell + child: PageTransitionSwitcher( + duration: const Duration(milliseconds: 200), + transitionBuilder: ( + (child, primaryAnimation, secondaryAnimation) => FadeThroughTransition( + animation: primaryAnimation, + secondaryAnimation: secondaryAnimation, + child: child, + ) + ), + child: screens[appConfigProvider.selectedScreen].child, + ), ), ], ), @@ -126,18 +134,28 @@ class _LayoutState extends State { : screensSelectServer; return Scaffold( - body: widget.navigationShell, + body: PageTransitionSwitcher( + duration: const Duration(milliseconds: 200), + transitionBuilder: ( + (child, primaryAnimation, secondaryAnimation) => FadeThroughTransition( + animation: primaryAnimation, + secondaryAnimation: secondaryAnimation, + child: child, + ) + ), + child: screens[appConfigProvider.selectedScreen].child, + ), bottomNavigationBar: NavigationBar( - selectedIndex: (serversProvider.selectedServer == null || serversProvider.apiClient == null) && widget.navigationShell.currentIndex > 1 + selectedIndex: (serversProvider.selectedServer == null || serversProvider.apiClient == null) && appConfigProvider.selectedScreen > 1 ? 0 - : widget.navigationShell.currentIndex, + : appConfigProvider.selectedScreen, onDestinationSelected: (s) => _goBranch(s), destinations: screens.asMap().entries.map((screen) => NavigationDestination( icon: Stack( children: [ Icon( screen.value.icon, - color: widget.navigationShell.currentIndex == screen.key + color: appConfigProvider.selectedScreen == screen.key ? Theme.of(context).colorScheme.onSecondaryContainer : Theme.of(context).colorScheme.onSurfaceVariant, ), diff --git a/pubspec.lock b/pubspec.lock index a194327..cb2cff6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -318,14 +318,6 @@ packages: description: flutter source: sdk version: "0.0.0" - go_router: - dependency: "direct main" - description: - name: go_router - sha256: e156bc1b2088eb5ece9351bccd48c3e1719a4858eacbd44e59162e98a68205d1 - url: "https://pub.dev" - source: hosted - version: "12.0.1" html: dependency: "direct main" description: @@ -398,14 +390,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" - logging: - dependency: transitive - description: - name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.dev" - source: hosted - version: "1.2.0" markdown: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 06ae67d..778459c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -74,7 +74,6 @@ dependencies: flutter_dotenv: ^5.0.2 flutter_reorderable_list: ^1.3.1 pie_chart: ^5.3.2 - go_router: ^12.0.1 flutter_hooks: ^0.20.3 dev_dependencies: