Implemented Navigation

This commit is contained in:
Mohammad Salameh
2024-02-14 13:26:09 +03:00
parent 2707124a10
commit 3f1f8e72b3
13 changed files with 191 additions and 75 deletions

View File

@ -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<Widget> 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();
}
}

View File

@ -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);
}

View File

@ -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<HomeProvider>(
builder: (context, provider, child) {
return Scaffold(
appBar: const DefaultAppBar(),
body: provider.pageIndex == 0
? const HomeViewBody()
: provider.currentPage,
bottomNavigationBar: const DefaultNavBar(),
);
},
),
);
}

View File

@ -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'),
);
}
}

View File

@ -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<ProfileProvider>();
return Container();
}
}

View File

@ -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<SceneProvider>();
return Container();
}
}

View File

@ -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<HomeProvider>().updatePageIndex(index, context);
},
currentIndex: context.watch<HomeProvider>().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',
),
],
),
);
}
}

View File

@ -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<SmartProvider>();
return Container();
}
}

View File

@ -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'),
),
);
}
}

View File

@ -36,7 +36,7 @@ class _MyAppState extends State<MyApp> {
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

View File

@ -4,17 +4,17 @@ import 'routing_constants.dart';
class RouteManager {
List<String> routesWithoutLogin = [
RouteConstants.homeRoute,
Routes.homeRoute,
];
List<String> 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);

View File

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

View File

@ -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';
}