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/dashboard/view/dashboard_view.dart';
|
||||||
import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.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/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/features/scene/view/scene_view.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/assets_manager.dart';
|
||||||
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
|
||||||
@ -39,7 +39,7 @@ class NavCubit extends Cubit<NavState> {
|
|||||||
const LayoutPage(),
|
const LayoutPage(),
|
||||||
const DevicesViewBody(),
|
const DevicesViewBody(),
|
||||||
const SceneView(),
|
const SceneView(),
|
||||||
const ProfileView(),
|
const MenuView(),
|
||||||
];
|
];
|
||||||
|
|
||||||
Widget get currentPage => NavCubit().pages[pageIndex];
|
Widget get currentPage => NavCubit().pages[pageIndex];
|
||||||
|
@ -1,8 +1,94 @@
|
|||||||
import 'package:bloc/bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:meta/meta.dart';
|
|
||||||
|
import '../model/list_item_model.dart';
|
||||||
|
import '../model/menu_list_model.dart';
|
||||||
|
|
||||||
part 'menu_state.dart';
|
part 'menu_state.dart';
|
||||||
|
|
||||||
class MenuCubit extends Cubit<MenuState> {
|
class MenuCubit extends Cubit<MenuState> {
|
||||||
MenuCubit() : super(MenuInitial());
|
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';
|
part of 'menu_cubit.dart';
|
||||||
|
|
||||||
@immutable
|
|
||||||
abstract class MenuState {}
|
abstract class MenuState {}
|
||||||
|
|
||||||
class MenuInitial extends 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/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 {
|
class MenuView extends StatelessWidget {
|
||||||
const MenuView({super.key});
|
const MenuView({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return const Center(
|
return BlocProvider(
|
||||||
child: Text('Menu View'),
|
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