From 22367c661e14d8b63997a0b2c22d062b2916b03f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr> Date: Fri, 2 Feb 2024 23:24:23 +0100 Subject: [PATCH] Improve navigation management --- android/gradle.properties | 4 +- lib/config/menu.dart | 78 ++++++++++++++++++++++++++++++ lib/cubit/bottom_nav_cubit.dart | 6 +-- lib/ui/skeleton.dart | 22 ++------- lib/ui/widgets/bottom_nav_bar.dart | 34 +------------ pubspec.yaml | 2 +- 6 files changed, 89 insertions(+), 57 deletions(-) create mode 100644 lib/config/menu.dart diff --git a/android/gradle.properties b/android/gradle.properties index e7bbd47..84e1e41 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true -app.versionName=1.0.44 -app.versionCode=45 +app.versionName=1.0.45 +app.versionCode=46 diff --git a/lib/config/menu.dart b/lib/config/menu.dart new file mode 100644 index 0000000..45c0692 --- /dev/null +++ b/lib/config/menu.dart @@ -0,0 +1,78 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:unicons/unicons.dart'; + +import 'package:random/ui/screens/about_page.dart'; +import 'package:random/ui/screens/api_page.dart'; +import 'package:random/ui/screens/camera_page.dart'; +import 'package:random/ui/screens/demo_page.dart'; +import 'package:random/ui/screens/game_page.dart'; +import 'package:random/ui/screens/graph_page.dart'; +import 'package:random/ui/screens/settings_page.dart'; + +class MenuItem { + final String code; + final Icon icon; + final Widget page; + + const MenuItem({ + required this.code, + required this.icon, + required this.page, + }); +} + +class Menu { + static List<MenuItem> items = [ + MenuItem( + code: 'bottom_nav_sample', + icon: const Icon(UniconsLine.image), + page: DemoPage(), + ), + MenuItem( + code: 'bottom_nav_api', + icon: const Icon(UniconsLine.globe), + page: ApiPage(), + ), + MenuItem( + code: 'bottom_nav_camera', + icon: const Icon(UniconsLine.camera), + page: CameraPage(), + ), + MenuItem( + code: 'bottom_nav_chart', + icon: const Icon(UniconsLine.pen), + page: GraphPage(), + ), + MenuItem( + code: 'bottom_nav_game', + icon: const Icon(UniconsLine.star), + page: GamePage(), + ), + MenuItem( + code: 'bottom_nav_settings', + icon: const Icon(UniconsLine.setting), + page: SettingsPage(), + ), + MenuItem( + code: 'bottom_nav_about', + icon: const Icon(UniconsLine.info_circle), + page: AboutPage(), + ), + ]; + + static Widget getPageWidget(int pageIndex) { + return Menu.items.elementAt(pageIndex).page; + } + + static List<BottomNavigationBarItem> getMenuItems() { + return Menu.items + .map((MenuItem item) => BottomNavigationBarItem( + icon: item.icon, + label: tr(item.code), + )) + .toList(); + } + + static int itemsCount = Menu.items.length; +} diff --git a/lib/cubit/bottom_nav_cubit.dart b/lib/cubit/bottom_nav_cubit.dart index a02cc94..76d5c37 100644 --- a/lib/cubit/bottom_nav_cubit.dart +++ b/lib/cubit/bottom_nav_cubit.dart @@ -1,10 +1,10 @@ import 'package:hydrated_bloc/hydrated_bloc.dart'; +import 'package:random/config/menu.dart'; + class BottomNavCubit extends HydratedCubit<int> { BottomNavCubit() : super(0); - int pagesCount = 6; - void updateIndex(int index) { if (isIndexAllowed(index)) { emit(index); @@ -14,7 +14,7 @@ class BottomNavCubit extends HydratedCubit<int> { } bool isIndexAllowed(int index) { - return (index >= 0) && (index < pagesCount); + return (index >= 0) && (index < Menu.itemsCount); } void goToHomePage() => emit(0); diff --git a/lib/ui/skeleton.dart b/lib/ui/skeleton.dart index 044b573..e863619 100644 --- a/lib/ui/skeleton.dart +++ b/lib/ui/skeleton.dart @@ -2,14 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_swipe/flutter_swipe.dart'; +import 'package:random/config/menu.dart'; import 'package:random/cubit/bottom_nav_cubit.dart'; -import 'package:random/ui/screens/about_page.dart'; -import 'package:random/ui/screens/api_page.dart'; -import 'package:random/ui/screens/camera_page.dart'; -import 'package:random/ui/screens/demo_page.dart'; -import 'package:random/ui/screens/game_page.dart'; -import 'package:random/ui/screens/graph_page.dart'; -import 'package:random/ui/screens/settings_page.dart'; import 'package:random/ui/widgets/app_bar.dart'; import 'package:random/ui/widgets/bottom_nav_bar.dart'; @@ -23,23 +17,13 @@ class SkeletonScreen extends StatefulWidget { class _SkeletonScreenState extends State<SkeletonScreen> { @override Widget build(BuildContext context) { - const List<Widget> pageNavigation = <Widget>[ - DemoPage(), - ApiPage(), - CameraPage(), - GraphPage(), - GamePage(), - SettingsPage(), - AboutPage(), - ]; - return Scaffold( extendBodyBehindAppBar: false, appBar: StandardAppBar(), body: Swiper( - itemCount: BlocProvider.of<BottomNavCubit>(context).pagesCount, + itemCount: Menu.itemsCount, itemBuilder: (BuildContext context, int index) { - return pageNavigation.elementAt(index); + return Menu.getPageWidget(index); }, pagination: SwiperPagination( builder: SwiperCustomPagination( diff --git a/lib/ui/widgets/bottom_nav_bar.dart b/lib/ui/widgets/bottom_nav_bar.dart index 2013e65..f5b356e 100644 --- a/lib/ui/widgets/bottom_nav_bar.dart +++ b/lib/ui/widgets/bottom_nav_bar.dart @@ -1,9 +1,8 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_swipe/flutter_swipe.dart'; -import 'package:unicons/unicons.dart'; +import 'package:random/config/menu.dart'; import 'package:random/cubit/bottom_nav_cubit.dart'; class BottomNavBar extends StatelessWidget { @@ -41,36 +40,7 @@ class BottomNavBar extends StatelessWidget { backgroundColor: Colors.transparent, selectedItemColor: Theme.of(context).colorScheme.primary, unselectedItemColor: Theme.of(context).textTheme.bodySmall!.color, - items: <BottomNavigationBarItem>[ - BottomNavigationBarItem( - icon: const Icon(UniconsLine.image), - label: tr('bottom_nav_sample'), - ), - BottomNavigationBarItem( - icon: const Icon(UniconsLine.globe), - label: tr('bottom_nav_api'), - ), - BottomNavigationBarItem( - icon: const Icon(UniconsLine.camera), - label: tr('bottom_nav_camera'), - ), - BottomNavigationBarItem( - icon: const Icon(UniconsLine.pen), - label: tr('bottom_nav_chart'), - ), - BottomNavigationBarItem( - icon: const Icon(UniconsLine.star), - label: tr('bottom_nav_game'), - ), - BottomNavigationBarItem( - icon: const Icon(UniconsLine.setting), - label: tr('bottom_nav_settings'), - ), - BottomNavigationBarItem( - icon: const Icon(UniconsLine.info_circle), - label: tr('bottom_nav_about'), - ), - ], + items: Menu.getMenuItems(), ); }, ), diff --git a/pubspec.yaml b/pubspec.yaml index 2e0ad1d..96d1982 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A random application, for testing purpose only. publish_to: 'none' -version: 1.0.44+45 +version: 1.0.45+46 environment: sdk: '^3.0.0' -- GitLab