Refactor HomeCubit class for better instance management

Create a private static instance variable and refactor methods for better instance management in the HomeCubit class.
This commit is contained in:
Mohammad Salameh
2024-04-01 12:09:01 +03:00
parent a20dfa3709
commit d1bc973b38
10 changed files with 169 additions and 145 deletions

View File

@ -17,8 +17,10 @@ import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
part 'home_state.dart'; part 'home_state.dart';
class HomeCubit extends Cubit<HomeState> { class HomeCubit extends Cubit<HomeState> {
HomeCubit() : super(SpacesInitial()) { // Create a private static instance variable
if (HomeCubit.spaces != null) { static HomeCubit? _instance;
HomeCubit._() : super(HomeInitial()) {
if (spaces != null) {
if (selectedSpace == null) { if (selectedSpace == null) {
fetchSpaces().then((value) { fetchSpaces().then((value) {
if (selectedSpace != null) { if (selectedSpace != null) {
@ -31,12 +33,17 @@ class HomeCubit extends Cubit<HomeState> {
fetchSpaces(); // this is for the first time fetchSpaces(); // this is for the first time
} }
} }
static HomeCubit getInstance() {
// If an instance already exists, return it
_instance ??= HomeCubit._();
return _instance!;
}
static HomeCubit get(context) => BlocProvider.of(context); static HomeCubit get(context) => BlocProvider.of(context);
static List<SpaceModel>? spaces; List<SpaceModel>? spaces;
static SpaceModel? selectedSpace; SpaceModel? selectedSpace;
RoomModel? selectedRoom; RoomModel? selectedRoom;
@ -46,7 +53,12 @@ class HomeCubit extends Cubit<HomeState> {
var duration = const Duration(milliseconds: 300); var duration = const Duration(milliseconds: 300);
selectSpace(SpaceModel space) { // selectSpace(SpaceModel space) async {
// selectedSpace = space;
// emit(SpaceSelected(space));
// }
changeSelectedSpace(SpaceModel space) {
selectedSpace = space; selectedSpace = space;
emit(SpaceSelected(space)); emit(SpaceSelected(space));
} }
@ -102,7 +114,11 @@ class HomeCubit extends Cubit<HomeState> {
emit(GetSpacesLoading()); emit(GetSpacesLoading());
try { try {
spaces = await SpacesAPI.getSpaces(); spaces = await SpacesAPI.getSpaces();
selectedSpace = spaces!.isNotEmpty ? selectSpace(spaces!.first) : null; selectedSpace = spaces!.isNotEmpty
?
// selectSpace(spaces!.first)
selectedSpace = spaces!.first
: null;
emit(GetSpacesLoaded(spaces!)); emit(GetSpacesLoaded(spaces!));
} on DioException catch (e) { } on DioException catch (e) {
emit(GetSpacesError(ServerFailure.fromDioError(e).errMessage)); emit(GetSpacesError(ServerFailure.fromDioError(e).errMessage));

View File

@ -2,7 +2,7 @@ part of 'home_cubit.dart';
abstract class HomeState {} abstract class HomeState {}
class SpacesInitial extends HomeState {} class HomeInitial extends HomeState {}
class GetSpacesLoading extends HomeState {} class GetSpacesLoading extends HomeState {}

View File

@ -23,13 +23,13 @@ class AppLayout extends StatelessWidget {
return MultiBlocProvider( return MultiBlocProvider(
providers: [ providers: [
BlocProvider( BlocProvider(
create: (context) => HomeCubit(), create: (context) => HomeCubit.getInstance(),
), ),
BlocProvider( BlocProvider(
create: (context) => DevicesCubit(), create: (context) => DevicesCubit(),
), ),
], ],
child: BlocListener<HomeCubit, HomeState>( child: BlocConsumer<HomeCubit, HomeState>(
listener: (context, state) { listener: (context, state) {
if (state is GetSpacesError) { if (state is GetSpacesError) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
@ -41,7 +41,6 @@ class AppLayout extends StatelessWidget {
.popUntil((route) => route.settings.name == Routes.authLogin); .popUntil((route) => route.settings.name == Routes.authLogin);
} }
}, },
child: BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) { builder: (context, state) {
return AnnotatedRegion( return AnnotatedRegion(
value: SystemUiOverlayStyle( value: SystemUiOverlayStyle(
@ -51,13 +50,14 @@ class AppLayout extends StatelessWidget {
child: SafeArea( child: SafeArea(
child: BlocBuilder<HomeCubit, HomeState>( child: BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) { builder: (context, state) {
return const Scaffold( return Scaffold(
backgroundColor: ColorsManager.backgroundColor, backgroundColor: ColorsManager.backgroundColor,
extendBodyBehindAppBar: true, extendBodyBehindAppBar: true,
extendBody: true, extendBody: true,
appBar: DefaultAppBar(), appBar:
body: AppBody(), state is GetSpacesLoaded ? const DefaultAppBar() : null,
bottomNavigationBar: DefaultNavBar(), body: const AppBody(),
bottomNavigationBar: const DefaultNavBar(),
// floatingActionButton: FloatingActionButton( // floatingActionButton: FloatingActionButton(
// onPressed: () { // onPressed: () {
// Navigator.push( // Navigator.push(
@ -77,7 +77,6 @@ class AppLayout extends StatelessWidget {
); );
}, },
), ),
),
); );
} }
} }

View File

@ -9,17 +9,13 @@ import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
import '../../../../generated/assets.dart'; import '../../../../generated/assets.dart';
class AppBarHomeDropdown extends StatelessWidget { class AppBarHomeDropdown extends StatelessWidget {
const AppBarHomeDropdown({ const AppBarHomeDropdown({super.key});
super.key,
});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<HomeCubit, HomeState>( return BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) { builder: (context, state) {
return HomeCubit.selectedSpace == null return Padding(
? const Center(child: BodyMedium(text: 'No Home Selected'))
: Padding(
padding: const EdgeInsets.only(left: 10, right: 10), padding: const EdgeInsets.only(left: 10, right: 10),
child: DropdownButton( child: DropdownButton(
icon: const Icon( icon: const Icon(
@ -30,8 +26,8 @@ class AppBarHomeDropdown extends StatelessWidget {
underline: const SizedBox.shrink(), underline: const SizedBox.shrink(),
padding: const EdgeInsets.all(0), padding: const EdgeInsets.all(0),
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
value: HomeCubit.selectedSpace!.id, value: HomeCubit.getInstance().selectedSpace!.id,
items: HomeCubit.spaces!.map((space) { items: HomeCubit.getInstance().spaces!.map((space) {
return DropdownMenuItem( return DropdownMenuItem(
value: space.id, value: space.id,
child: SizedBox( child: SizedBox(
@ -67,7 +63,9 @@ class AppBarHomeDropdown extends StatelessWidget {
}).toList(), }).toList(),
onChanged: (value) { onChanged: (value) {
if (value != null) { if (value != null) {
HomeCubit.get(context).selectSpace(HomeCubit.spaces! HomeCubit.getInstance().changeSelectedSpace(
HomeCubit.getInstance()
.spaces!
.firstWhere((element) => element.id == value)); .firstWhere((element) => element.id == value));
} }
}, },

View File

@ -37,9 +37,10 @@ class AppBody extends StatelessWidget {
} }
}, },
builder: (context, state) { builder: (context, state) {
return state is! GetSpacesLoading || return state is! GetSpacesLoading
state is! GetSpaceRoomsLoading ? state is! GetSpaceRoomsLoading
? HomeCubit.get(context).pages[HomeCubit.pageIndex] ? HomeCubit.getInstance().pages[HomeCubit.pageIndex]
: const Center(child: CircularProgressIndicator())
: const Center(child: CircularProgressIndicator()); : const Center(child: CircularProgressIndicator());
}, },
), ),

View File

@ -20,11 +20,9 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
leadingWidth: 150, leadingWidth: 150,
toolbarHeight: Constants.appBarHeight, toolbarHeight: Constants.appBarHeight,
leading: HomeCubit.spaces != null leading: HomeCubit.getInstance().spaces!.isNotEmpty
? HomeCubit.spaces!.isNotEmpty
? HomeCubit.appBarLeading[ ? HomeCubit.appBarLeading[
HomeCubit.bottomNavItems[HomeCubit.pageIndex].label] HomeCubit.bottomNavItems[HomeCubit.pageIndex].label]
: const Center(child: BodySmall(text: 'Create Home'))
: null, : null,
actions: HomeCubit.appBarActions[ actions: HomeCubit.appBarActions[
HomeCubit.bottomNavItems[HomeCubit.pageIndex].label], HomeCubit.bottomNavItems[HomeCubit.pageIndex].label],

View File

@ -15,7 +15,7 @@ class DefaultNavBar extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<HomeCubit, HomeState>( return BlocBuilder<HomeCubit, HomeState>(
builder: (context, state) { builder: (context, state) {
var cubit = HomeCubit.get(context); var cubit = HomeCubit.getInstance();
return SizedBox( return SizedBox(
height: Constants.bottomNavBarHeight, height: Constants.bottomNavBarHeight,
child: BottomNavigationBar( child: BottomNavigationBar(
@ -25,8 +25,8 @@ class DefaultNavBar extends StatelessWidget {
if (DevicesCubit.get(context).chosenCategoryView != null) { if (DevicesCubit.get(context).chosenCategoryView != null) {
DevicesCubit().clearCategoriesSelection(context); DevicesCubit().clearCategoriesSelection(context);
} }
if (HomeCubit.get(context).selectedRoom != null) { if (HomeCubit.getInstance().selectedRoom != null) {
HomeCubit.get(context).unselectRoom(); HomeCubit.getInstance().unselectRoom();
} }
}, },
currentIndex: HomeCubit.pageIndex, currentIndex: HomeCubit.pageIndex,

View File

@ -22,8 +22,8 @@ part 'devices_state.dart';
class DevicesCubit extends Cubit<DevicesState> { class DevicesCubit extends Cubit<DevicesState> {
DevicesCubit() : super(DevicesInitial()) { DevicesCubit() : super(DevicesInitial()) {
if (HomeCubit.selectedSpace != null) { if (HomeCubit.getInstance().selectedSpace != null) {
fetchGroups(HomeCubit.selectedSpace!.id!); fetchGroups(HomeCubit.getInstance().selectedSpace!.id!);
} }
} }
bool _isClosed = false; bool _isClosed = false;

View File

@ -42,15 +42,19 @@ class DevicesViewBody extends StatelessWidget {
Expanded( Expanded(
child: PageView( child: PageView(
controller: controller:
HomeCubit.get(context).devicesPageController, HomeCubit.getInstance().devicesPageController,
onPageChanged: (index) { onPageChanged: (index) {
HomeCubit.get(context).devicesPageChanged(index); HomeCubit.getInstance().devicesPageChanged(index);
}, },
children: [ children: [
const WizardPage(), const WizardPage(),
if (HomeCubit.selectedSpace != null) if (HomeCubit.getInstance().selectedSpace != null)
if (HomeCubit.selectedSpace!.rooms != null) if (HomeCubit.getInstance().selectedSpace!.rooms !=
...HomeCubit.selectedSpace!.rooms!.map( null)
...HomeCubit.getInstance()
.selectedSpace!
.rooms!
.map(
(room) { (room) {
return RoomPage( return RoomPage(
room: room, room: room,
@ -60,15 +64,19 @@ class DevicesViewBody extends StatelessWidget {
], ],
), ),
), ),
HomeCubit.selectedSpace != null HomeCubit.getInstance().selectedSpace != null
? Padding( ? Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
vertical: 7, vertical: 7,
), ),
child: SmoothPageIndicator( child: SmoothPageIndicator(
controller: controller:
HomeCubit.get(context).devicesPageController, HomeCubit.getInstance().devicesPageController,
count: HomeCubit.selectedSpace!.rooms!.length + 1, count: HomeCubit.getInstance()
.selectedSpace!
.rooms!
.length +
1,
effect: const WormEffect( effect: const WormEffect(
paintStyle: PaintingStyle.stroke, paintStyle: PaintingStyle.stroke,
dotHeight: 8, dotHeight: 8,

View File

@ -18,43 +18,47 @@ class RoomsSlider extends StatelessWidget {
return SizedBox( return SizedBox(
height: 40, height: 40,
child: PageView( child: PageView(
controller: HomeCubit.get(context).roomsPageController, controller: HomeCubit.getInstance().roomsPageController,
onPageChanged: (index) { onPageChanged: (index) {
HomeCubit.get(context).roomSliderPageChanged(index); HomeCubit.getInstance().roomSliderPageChanged(index);
}, },
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 15), padding: const EdgeInsets.symmetric(horizontal: 15),
child: InkWell( child: InkWell(
onTap: () { onTap: () {
HomeCubit.get(context).unselectRoom(); HomeCubit.getInstance().unselectRoom();
}, },
child: TitleMedium( child: TitleMedium(
text: StringsManager.wizard, text: StringsManager.wizard,
style: context.titleMedium.copyWith( style: context.titleMedium.copyWith(
fontSize: 25, fontSize: 25,
color: HomeCubit.get(context).selectedRoom == null color: HomeCubit.getInstance().selectedRoom == null
? ColorsManager.textPrimaryColor ? ColorsManager.textPrimaryColor
: ColorsManager.textPrimaryColor.withOpacity(.2), : ColorsManager.textPrimaryColor.withOpacity(.2),
), ),
), ),
), ),
), ),
if (HomeCubit.selectedSpace != null) if (HomeCubit.getInstance().selectedSpace != null)
if (HomeCubit.selectedSpace!.rooms != null) if (HomeCubit.getInstance().selectedSpace!.rooms != null)
...HomeCubit.selectedSpace!.rooms!.map( ...HomeCubit.getInstance().selectedSpace!.rooms!.map(
(room) => Padding( (room) => Padding(
padding: const EdgeInsets.symmetric(horizontal: 15), padding: const EdgeInsets.symmetric(horizontal: 15),
child: InkWell( child: InkWell(
onTap: () { onTap: () {
HomeCubit.get(context).roomSliderPageChanged( HomeCubit.getInstance().roomSliderPageChanged(
HomeCubit.selectedSpace!.rooms!.indexOf(room)); HomeCubit.getInstance()
.selectedSpace!
.rooms!
.indexOf(room));
}, },
child: TitleMedium( child: TitleMedium(
text: room.name!, text: room.name!,
style: context.titleMedium.copyWith( style: context.titleMedium.copyWith(
fontSize: 25, fontSize: 25,
color: HomeCubit.get(context).selectedRoom == room color:
HomeCubit.getInstance().selectedRoom == room
? ColorsManager.textPrimaryColor ? ColorsManager.textPrimaryColor
: ColorsManager.textPrimaryColor : ColorsManager.textPrimaryColor
.withOpacity(.2), .withOpacity(.2),