diff --git a/lib/features/home/provider/provider.dart b/lib/features/home/provider/provider.dart index 918d54e..aa35a53 100644 --- a/lib/features/home/provider/provider.dart +++ b/lib/features/home/provider/provider.dart @@ -1,3 +1,24 @@ import 'package:flutter/material.dart'; +import 'package:syncrow_app/features/home/view/home_view.dart'; +import 'package:syncrow_app/features/profile/view/profile_view.dart'; +import 'package:syncrow_app/features/scene/view/scene_view.dart'; +import 'package:syncrow_app/features/smart/view/smart_view.dart'; -class SceneProvider extends ChangeNotifier {} +class HomeProvider extends ChangeNotifier { + int pageIndex = 0; + + final List pages = [ + const HomeView(), + const SceneView(), + const SmartView(), + const ProfileView(), + ]; + + //get current page + Widget get currentPage => pages[pageIndex]; + + void updatePageIndex(int index, BuildContext context) { + pageIndex = index; + notifyListeners(); + } +} diff --git a/lib/features/home/view/default_app_bar.dart b/lib/features/home/view/default_app_bar.dart new file mode 100644 index 0000000..e2f88bc --- /dev/null +++ b/lib/features/home/view/default_app_bar.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget { + const DefaultAppBar({super.key}); + + @override + Widget build(BuildContext context) { + return AppBar( + title: const Text('Syncrow'), + ); + } + + @override + Size get preferredSize => const Size.fromHeight(50); +} diff --git a/lib/features/home/view/home_view.dart b/lib/features/home/view/home_view.dart index b5958f3..16ca50a 100644 --- a/lib/features/home/view/home_view.dart +++ b/lib/features/home/view/home_view.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:syncrow_app/features/home/provider/provider.dart'; +import 'package:syncrow_app/features/home/view/default_app_bar.dart'; +import 'package:syncrow_app/features/home/view/home_view_body.dart'; +import 'package:syncrow_app/features/shared_widgets/default_nav_bar.dart'; class HomeView extends StatelessWidget { const HomeView({super.key}); @@ -8,46 +11,17 @@ class HomeView extends StatelessWidget { @override Widget build(BuildContext context) { return ChangeNotifierProvider( - create: (BuildContext context) => SceneProvider(), - builder: (context, child) => Scaffold( - appBar: AppBar( - title: const Text('Syncrow'), - ), - body: const Center( - child: Text('Home'), - ), - bottomNavigationBar: BottomNavigationBar( - items: const [ - BottomNavigationBarItem( - icon: Icon( - Icons.home_outlined, - color: Colors.grey, - ), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Icon( - Icons.view_in_ar, - color: Colors.grey, - ), - label: 'Scene', - ), - BottomNavigationBarItem( - icon: Icon( - Icons.smart_toy_outlined, - color: Colors.grey, - ), - label: 'Smart', - ), - BottomNavigationBarItem( - icon: Icon( - Icons.account_circle, - color: Colors.grey, - ), - label: 'Account', - ), - ], - ), + create: (BuildContext context) => HomeProvider(), + builder: (context, child) => Consumer( + builder: (context, provider, child) { + return Scaffold( + appBar: const DefaultAppBar(), + body: provider.pageIndex == 0 + ? const HomeViewBody() + : provider.currentPage, + bottomNavigationBar: const DefaultNavBar(), + ); + }, ), ); } diff --git a/lib/features/home/view/home_view_body.dart b/lib/features/home/view/home_view_body.dart new file mode 100644 index 0000000..87f9bdd --- /dev/null +++ b/lib/features/home/view/home_view_body.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +class HomeViewBody extends StatelessWidget { + const HomeViewBody({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return const Center( + child: Text('Home'), + ); + } +} diff --git a/lib/features/profile/view/profile_view.dart b/lib/features/profile/view/profile_view.dart index 4ffdc52..be3be2e 100644 --- a/lib/features/profile/view/profile_view.dart +++ b/lib/features/profile/view/profile_view.dart @@ -10,13 +10,9 @@ class ProfileView extends StatelessWidget { Widget build(BuildContext context) { return ChangeNotifierProvider( create: (BuildContext context) => ProfileProvider(), - builder: (context, child) => _buildPage(context), + builder: (context, child) => const Center( + child: Text('Profile'), + ), ); } - - Widget _buildPage(BuildContext context) { - final provider = context.read(); - - return Container(); - } } diff --git a/lib/features/scene/view/scene_view.dart b/lib/features/scene/view/scene_view.dart index acf393c..135334b 100644 --- a/lib/features/scene/view/scene_view.dart +++ b/lib/features/scene/view/scene_view.dart @@ -1,21 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:syncrow_app/features/home/provider/provider.dart'; class SceneView extends StatelessWidget { const SceneView({super.key}); @override Widget build(BuildContext context) { - return ChangeNotifierProvider( - create: (BuildContext context) => SceneProvider(), - builder: (context, child) => _buildPage(context), + return const Center( + child: Text('Scene'), ); } - - Widget _buildPage(BuildContext context) { - final provider = context.read(); - - return Container(); - } } diff --git a/lib/features/shared_widgets/default_nav_bar.dart b/lib/features/shared_widgets/default_nav_bar.dart new file mode 100644 index 0000000..514e05d --- /dev/null +++ b/lib/features/shared_widgets/default_nav_bar.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:syncrow_app/features/home/provider/provider.dart'; + +class DefaultNavBar extends StatelessWidget { + const DefaultNavBar({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (BuildContext context) => HomeProvider(), + child: BottomNavigationBar( + onTap: (int index) { + context.read().updatePageIndex(index, context); + }, + currentIndex: context.watch().pageIndex, + selectedIconTheme: const IconThemeData( + color: Colors.black, + ), + selectedLabelStyle: const TextStyle( + color: Colors.black, + ), + items: const [ + BottomNavigationBarItem( + icon: Icon( + Icons.home_outlined, + color: Colors.grey, + ), + label: 'Home', + ), + BottomNavigationBarItem( + icon: Icon( + Icons.view_in_ar, + color: Colors.grey, + ), + label: 'Scene', + ), + BottomNavigationBarItem( + icon: Icon( + Icons.smart_toy_outlined, + color: Colors.grey, + ), + label: 'Smart', + ), + BottomNavigationBarItem( + icon: Icon( + Icons.account_circle, + color: Colors.grey, + ), + label: 'Account', + ), + ], + ), + ); + } +} diff --git a/lib/features/smart/view/smart_view.dart b/lib/features/smart/view/smart_view.dart index e8e1a9e..56d1496 100644 --- a/lib/features/smart/view/smart_view.dart +++ b/lib/features/smart/view/smart_view.dart @@ -10,13 +10,9 @@ class SmartView extends StatelessWidget { Widget build(BuildContext context) { return ChangeNotifierProvider( create: (BuildContext context) => SmartProvider(), - builder: (context, child) => _buildPage(context), + builder: (context, child) => const Center( + child: Text('Smart'), + ), ); } - - Widget _buildPage(BuildContext context) { - final provider = context.read(); - - return Container(); - } } diff --git a/lib/features/splash/splash_view.dart b/lib/features/splash/splash_view.dart new file mode 100644 index 0000000..00c9401 --- /dev/null +++ b/lib/features/splash/splash_view.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:syncrow_app/navigation/route_manager.dart'; +import 'package:syncrow_app/navigation/routing_constants.dart'; + +class SplashView extends StatelessWidget { + const SplashView({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + actions: [ + IconButton( + icon: const Icon(Icons.arrow_forward), + onPressed: () { + RouteManager().routerManagerPopAndPushNamed( + routeName: Routes.homeRoute, + context: context, + ); + }, + ), + ], + ), + body: const Center( + child: Text('Splash Screen'), + ), + ); + } +} diff --git a/lib/my_app.dart b/lib/my_app.dart index 08792e7..c8b2bdb 100644 --- a/lib/my_app.dart +++ b/lib/my_app.dart @@ -36,7 +36,7 @@ class _MyAppState extends State { color: Colors.white, title: 'Syncrow App', onGenerateRoute: router.Router.generateRoute, - initialRoute: RouteConstants.homeRoute, + initialRoute: Routes.splash, themeMode: ThemeMode.system, supportedLocales: const [ Locale('en', ''), // English, no country code diff --git a/lib/navigation/route_manager.dart b/lib/navigation/route_manager.dart index 35dc561..03a49f9 100644 --- a/lib/navigation/route_manager.dart +++ b/lib/navigation/route_manager.dart @@ -4,17 +4,17 @@ import 'routing_constants.dart'; class RouteManager { List routesWithoutLogin = [ - RouteConstants.homeRoute, + Routes.homeRoute, ]; List exclusionList = []; + //TODO (to mohammad) add the context extension routerManager({required String routeName, required BuildContext context}) { Navigator.of(context).pushNamed(routeName); } - routerManagerPushUntil( - {required String routeName, required BuildContext? context}) { + routerManagerPushUntil(BuildContext? context, {required String routeName}) { if (context != null) { Navigator.of(context) .pushNamedAndRemoveUntil(routeName, (route) => false); diff --git a/lib/navigation/router.dart b/lib/navigation/router.dart index 4addfc2..056b722 100644 --- a/lib/navigation/router.dart +++ b/lib/navigation/router.dart @@ -1,16 +1,35 @@ import 'package:flutter/material.dart'; import 'package:syncrow_app/features/home/view/home_view.dart'; +import 'package:syncrow_app/features/profile/view/profile_view.dart'; +import 'package:syncrow_app/features/scene/view/scene_view.dart'; +import 'package:syncrow_app/features/smart/view/smart_view.dart'; +import 'package:syncrow_app/features/splash/splash_view.dart'; import 'routing_constants.dart'; class Router { static Route generateRoute(RouteSettings settings) { switch (settings.name) { - case RouteConstants.homeRoute: + case Routes.splash: + return MaterialPageRoute( + builder: (_) => const SplashView(), settings: settings); + + case Routes.homeRoute: return MaterialPageRoute( builder: (_) => const HomeView(), settings: settings); - // Default route, if no route this will show + case Routes.profileRoute: + return MaterialPageRoute( + builder: (_) => const ProfileView(), settings: settings); + + case Routes.sceneRoute: + return MaterialPageRoute( + builder: (_) => const SceneView(), settings: settings); + + case Routes.smartRoute: + return MaterialPageRoute( + builder: (_) => const SmartView(), settings: settings); + default: return MaterialPageRoute( builder: (_) => Scaffold( diff --git a/lib/navigation/routing_constants.dart b/lib/navigation/routing_constants.dart index 61d6210..7641e16 100644 --- a/lib/navigation/routing_constants.dart +++ b/lib/navigation/routing_constants.dart @@ -1,4 +1,7 @@ -class RouteConstants { - static const String homeRoute = "/"; -// static const String splash = '/'; +class Routes { + static const String splash = '/'; + static const String homeRoute = '/home'; + static const String sceneRoute = '/scene'; + static const String smartRoute = '/smart'; + static const String profileRoute = '/profile'; }