initialized Routine Page

This commit is contained in:
Mohammad Salameh
2024-02-21 13:47:08 +03:00
parent cdfb778884
commit d5196fda45
33 changed files with 569 additions and 236 deletions

View File

@ -0,0 +1,66 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/dashboard/view/dashboard_view.dart';
import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart';
import 'package:syncrow_app/features/layout/view/layout_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/utils/resource_manager/assets_manager.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
part 'nav_state.dart';
class NavCubit extends Cubit<NavState> {
NavCubit() : super(NavInitial());
static NavCubit of(context) => BlocProvider.of<NavCubit>(context);
static int pageIndex = 0;
int get getPageIndex => pageIndex;
Map<String, List<Widget>> appBarActions = {
'Home': [],
'Scene': [],
'Smart': [],
'Profile': [],
};
var bottomNavItems = [
defaultBottomNavBarItem(icon: IconsManager.dashboard, label: 'Dashboard'),
defaultBottomNavBarItem(icon: IconsManager.layout, label: 'Layout'),
defaultBottomNavBarItem(icon: IconsManager.devices, label: 'Devices'),
defaultBottomNavBarItem(icon: IconsManager.routine, label: 'Routine'),
defaultBottomNavBarItem(icon: IconsManager.menu, label: 'Menu'),
];
final List<Widget> pages = [
const DashboardView(),
const LayoutPage(),
const DevicesViewBody(),
const SceneView(),
const ProfileView(),
];
Widget get currentPage => NavCubit().pages[pageIndex];
void updatePageIndex(int index, BuildContext context) {
emit(NavChangePage());
pageIndex = index;
}
}
BottomNavigationBarItem defaultBottomNavBarItem(
{required String icon, required String label}) {
return BottomNavigationBarItem(
icon: SvgPicture.asset(icon),
activeIcon: SvgPicture.asset(
icon.replaceAll('.svg', '-fill.svg'),
colorFilter: const ColorFilter.mode(
ColorsManager.primaryColor,
BlendMode.srcIn,
),
),
label: label,
);
}

View File

@ -0,0 +1,7 @@
part of 'nav_cubit.dart';
abstract class NavState {}
class NavInitial extends NavState {}
class NavChangePage extends NavState {}

View File

@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
import 'package:syncrow_app/features/app_layout/view/widgets/app_body.dart';
import 'package:syncrow_app/features/app_layout/view/widgets/default_app_bar.dart';
import 'package:syncrow_app/features/app_layout/view/widgets/default_nav_bar.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class AppLayout extends StatelessWidget {
const AppLayout({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<NavCubit, NavState>(
builder: (context, state) {
return AnnotatedRegion(
value: SystemUiOverlayStyle(
statusBarColor: ColorsManager.primaryColor.withOpacity(0.5),
statusBarIconBrightness: Brightness.light,
),
child: const SafeArea(
child: Scaffold(
backgroundColor: ColorsManager.backgroundColor,
extendBodyBehindAppBar: true,
extendBody: true,
appBar: DefaultAppBar(),
body: AppBody(),
bottomNavigationBar: DefaultNavBar(),
),
),
);
},
);
}
}

View File

@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:gap/gap.dart';
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
import '../../../shared_widgets/text_widgets/body_large.dart';
class AppBarHomeDropdown extends StatelessWidget {
const AppBarHomeDropdown({
super.key,
});
@override
Widget build(BuildContext context) {
return TextButton(
onPressed: () {},
child: SizedBox(
width: 150,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
SvgPicture.asset(
IconsManager.home,
width: 25,
height: 25,
colorFilter: const ColorFilter.mode(
ColorsManager.textPrimaryColor,
BlendMode.srcIn,
),
),
const Gap(5),
const BodyLarge(text: 'Home'),
const Gap(5),
const Icon(
Icons.expand_more,
color: Colors.black,
)
],
),
),
);
}
}

View File

@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
class AppBody extends StatelessWidget {
const AppBody({
super.key,
});
@override
Widget build(BuildContext context) {
return BlocBuilder<NavCubit, NavState>(
builder: (context, state) {
return Container(
width: MediaQuery.sizeOf(context).width,
height: MediaQuery.sizeOf(context).height,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage(
ImageManager.background,
),
fit: BoxFit.cover,
opacity: 0.4,
),
),
child: Padding(
padding: const EdgeInsets.only(
top: 60, right: 15, left: 15, bottom: 100),
child: NavCubit.of(context).currentPage,
),
);
},
);
}
}

View File

@ -0,0 +1,38 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
import 'package:syncrow_app/features/app_layout/view/widgets/app_bar_home_dropdown.dart';
class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
const DefaultAppBar({super.key});
@override
Widget build(BuildContext context) {
return BlocBuilder<NavCubit, NavState>(
builder: (context, state) {
return Padding(
padding: const EdgeInsets.only(
top: 20,
),
child: AppBar(
backgroundColor: Colors.transparent,
leadingWidth: 150,
leading: const AppBarHomeDropdown(),
actions: <Widget>[
IconButton(
icon: const Icon(
Icons.add,
size: 35,
),
onPressed: () {},
),
],
),
);
},
);
}
@override
Size get preferredSize => const Size.fromHeight(100);
}

View File

@ -0,0 +1,41 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/bloc/nav_cubit.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class DefaultNavBar extends StatelessWidget {
const DefaultNavBar({
super.key,
});
@override
Widget build(BuildContext context) {
return BlocBuilder<NavCubit, NavState>(
builder: (context, state) {
var cubit = NavCubit.of(context);
return Padding(
padding: const EdgeInsets.only(bottom: 27),
child: BottomNavigationBar(
backgroundColor: Colors.transparent,
onTap: (int index) => cubit.updatePageIndex(index, context),
currentIndex: cubit.getPageIndex,
selectedItemColor: ColorsManager.primaryColor,
selectedLabelStyle: const TextStyle(
color: ColorsManager.primaryColor,
fontSize: 10,
),
showUnselectedLabels: true,
unselectedItemColor: Colors.grey,
type: BottomNavigationBarType.fixed,
elevation: 0,
items: cubit.bottomNavItems,
),
);
},
);
}
}
class DefaultBottomNavBarItem extends BottomNavigationBarItem {
DefaultBottomNavBarItem({required super.icon});
}