mirror of
https://github.com/SyncrowIOT/syncrow-app.git
synced 2025-07-16 10:06:16 +00:00
initialized menu page
This commit is contained in:
@ -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];
|
||||
|
@ -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',
|
||||
),
|
||||
],
|
||||
),
|
||||
];
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
part of 'menu_cubit.dart';
|
||||
|
||||
@immutable
|
||||
abstract class MenuState {}
|
||||
|
||||
class MenuInitial extends MenuState {}
|
||||
|
9
lib/features/menu/model/list_item_model.dart
Normal file
9
lib/features/menu/model/list_item_model.dart
Normal file
@ -0,0 +1,9 @@
|
||||
class ListItemModel {
|
||||
final String? icon;
|
||||
final String? label;
|
||||
|
||||
ListItemModel({
|
||||
this.icon,
|
||||
this.label,
|
||||
});
|
||||
}
|
11
lib/features/menu/model/menu_list_model.dart
Normal file
11
lib/features/menu/model/menu_list_model.dart
Normal file
@ -0,0 +1,11 @@
|
||||
import 'list_item_model.dart';
|
||||
|
||||
class MenuListModel {
|
||||
final String? label;
|
||||
final List<ListItemModel?>? listItems;
|
||||
|
||||
MenuListModel({
|
||||
this.label,
|
||||
this.listItems,
|
||||
});
|
||||
}
|
@ -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(),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
43
lib/features/menu/view/widgets/menu_list.dart
Normal file
43
lib/features/menu/view/widgets/menu_list.dart
Normal 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),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
17
lib/features/menu/view/widgets/menu_list_divider.dart
Normal file
17
lib/features/menu/view/widgets/menu_list_divider.dart
Normal 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,
|
||||
);
|
||||
}
|
||||
}
|
43
lib/features/menu/view/widgets/menu_list_item.dart
Normal file
43
lib/features/menu/view/widgets/menu_list_item.dart
Normal 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!,
|
||||
)
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user