initialized menu page

This commit is contained in:
Mohammad Salameh
2024-02-21 16:39:16 +03:00
parent d903849e92
commit c95a9c7817
9 changed files with 231 additions and 7 deletions

View File

@ -4,7 +4,7 @@ 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/menu/view/menu_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';
@ -39,7 +39,7 @@ class NavCubit extends Cubit<NavState> {
const LayoutPage(),
const DevicesViewBody(),
const SceneView(),
const ProfileView(),
const MenuView(),
];
Widget get currentPage => NavCubit().pages[pageIndex];

View File

@ -1,8 +1,94 @@
import 'package:bloc/bloc.dart';
import 'package:meta/meta.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../model/list_item_model.dart';
import '../model/menu_list_model.dart';
part 'menu_state.dart';
class MenuCubit extends Cubit<MenuState> {
MenuCubit() : super(MenuInitial());
static MenuCubit of(context) => BlocProvider.of<MenuCubit>(context);
List<MenuListModel> menuLists = [
MenuListModel(
label: 'Home Management',
listItems: [
ListItemModel(
label: 'Create a Home',
),
ListItemModel(
label: 'Join a Home',
),
ListItemModel(
label: 'Manage Your Home',
),
],
),
MenuListModel(
label: 'General Settings',
listItems: [
ListItemModel(
label: 'Voice Assistant',
),
ListItemModel(
label: 'Temperature unit',
),
ListItemModel(
label: 'Touch tone on panel',
),
ListItemModel(
label: 'Language',
),
ListItemModel(
label: 'Network diagnosis',
),
ListItemModel(
label: 'Clear cache',
),
],
),
MenuListModel(
label: 'Messages Center',
listItems: [
ListItemModel(
label: 'Alerts',
),
ListItemModel(
label: 'Messages',
),
ListItemModel(
label: 'FAQs',
),
ListItemModel(
label: 'Help & Feedback',
),
],
),
MenuListModel(
label: 'Security and Privacy',
listItems: [
ListItemModel(
label: 'Security',
),
ListItemModel(
label: 'privacy',
),
],
),
MenuListModel(
label: 'Legal Information',
listItems: [
ListItemModel(
label: 'About',
),
ListItemModel(
label: 'Privacy Policy',
),
ListItemModel(
label: 'User Agreement',
),
],
),
];
}

View File

@ -1,6 +1,5 @@
part of 'menu_cubit.dart';
@immutable
abstract class MenuState {}
class MenuInitial extends MenuState {}

View File

@ -0,0 +1,9 @@
class ListItemModel {
final String? icon;
final String? label;
ListItemModel({
this.icon,
this.label,
});
}

View File

@ -0,0 +1,11 @@
import 'list_item_model.dart';
class MenuListModel {
final String? label;
final List<ListItemModel?>? listItems;
MenuListModel({
this.label,
this.listItems,
});
}

View File

@ -1,12 +1,28 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/menu/bloc/menu_cubit.dart';
import 'package:syncrow_app/features/menu/view/widgets/menu_list.dart';
class MenuView extends StatelessWidget {
const MenuView({super.key});
@override
Widget build(BuildContext context) {
return const Center(
child: Text('Menu View'),
return BlocProvider(
create: (BuildContext context) => MenuCubit(),
child: BlocBuilder<MenuCubit, MenuState>(
builder: (context, state) {
return SingleChildScrollView(
physics: const BouncingScrollPhysics(),
child: Column(
children: MenuCubit.of(context)
.menuLists
.map((list) => MenuList(listModel: list))
.toList(),
),
);
},
),
);
}
}

View File

@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:syncrow_app/features/menu/model/menu_list_model.dart';
import 'package:syncrow_app/features/menu/view/widgets/menu_list_divider.dart';
import 'package:syncrow_app/features/menu/view/widgets/menu_list_item.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart';
class MenuList extends StatelessWidget {
const MenuList({
super.key,
required this.listModel,
});
final MenuListModel listModel;
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
BodySmall(
text: listModel.label!,
),
const Gap(5),
DefaultContainer(
child: ListView.separated(
shrinkWrap: true,
padding: const EdgeInsets.all(0),
physics: const NeverScrollableScrollPhysics(),
itemCount: listModel.listItems!.length,
itemBuilder: (context, index) {
return MenuListItem(
listItem: listModel.listItems![index]!,
);
},
separatorBuilder: (context, index) => const MenuListDivider()),
),
const Gap(5),
],
);
}
}

View File

@ -0,0 +1,17 @@
import 'package:flutter/material.dart';
class MenuListDivider extends StatelessWidget {
const MenuListDivider({
super.key,
});
@override
Widget build(BuildContext context) {
return Divider(
color: Colors.grey.withOpacity(0.5),
thickness: 1,
indent: 43,
endIndent: 10,
);
}
}

View File

@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/menu/model/list_item_model.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class MenuListItem extends StatelessWidget {
const MenuListItem({
super.key,
required this.listItem,
});
final ListItemModel listItem;
@override
Widget build(BuildContext context) {
return Column(
children: [
Row(
children: [
Container(
margin: const EdgeInsets.only(right: 10),
height: 33,
width: 33,
decoration: BoxDecoration(
color: ColorsManager.primaryColor,
borderRadius: BorderRadius.circular(15),
),
child: listItem.icon != null
? SvgPicture.asset(
listItem.icon!,
)
: null,
),
BodyMedium(
text: listItem.label!,
)
],
),
],
);
}
}