Stabilized UI elements across multiple devices

Synchronized ACs Status functionality
This commit is contained in:
Mohammad Salameh
2024-02-28 12:22:45 +03:00
parent 4c27cce519
commit 3fabd41e72
63 changed files with 431 additions and 383 deletions
@@ -51,7 +51,7 @@ class ACView extends StatelessWidget {
),
const Gap(10),
DevicesTempWidget(
model: DevicesCubit.categories[0].devices[index],
index,
),
const Gap(10),
ACControlUnit(
@@ -1,4 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart';
import '../../../../../utils/resource_manager/color_manager.dart';
import '../../../../shared_widgets/text_widgets/body_medium.dart';
@@ -11,60 +13,70 @@ class UniversalACSwitch extends StatelessWidget {
@override
Widget build(BuildContext context) {
bool acsStatus = AcCubit.get(context).areAllACsOff();
//TODO: Move these to String Manager "ON" and "OFF"
return Row(
children: <Widget>[
Expanded(
child: InkWell(
onTap: () {
AcCubit.get(context).turnAllACsOn();
},
child: Container(
height: 60,
decoration: BoxDecoration(
color: acsStatus ? ColorsManager.primaryColor : Colors.white,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(15),
bottomLeft: Radius.circular(15),
),
),
child: Center(
child: BodyMedium(
text: "ON",
fontColor: acsStatus ? Colors.white : null,
fontWeight: FontWeight.bold,
return BlocBuilder<AcCubit, AcState>(
builder: (context, state) {
return Row(
children: <Widget>[
Expanded(
child: InkWell(
onTap: () {
AcCubit.get(context).turnAllACsOn();
},
child: Container(
height: 60,
decoration: BoxDecoration(
color: DevicesCubit.categories[0].devicesStatus
? ColorsManager.primaryColor
: Colors.white,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(15),
bottomLeft: Radius.circular(15),
),
),
child: Center(
child: BodyMedium(
text: "ON",
fontColor: DevicesCubit.categories[0].devicesStatus
? Colors.white
: null,
fontWeight: FontWeight.bold,
),
),
),
),
),
),
),
Expanded(
child: InkWell(
onTap: () {
AcCubit.get(context).turnAllACsOff();
},
child: Container(
height: 60,
decoration: BoxDecoration(
color: acsStatus ? Colors.white : ColorsManager.primaryColor,
borderRadius: const BorderRadius.only(
topRight: Radius.circular(15),
bottomRight: Radius.circular(15),
),
),
child: Center(
child: BodyMedium(
text: "OFF",
fontColor: acsStatus ? null : Colors.white,
fontWeight: FontWeight.bold,
Expanded(
child: InkWell(
onTap: () {
AcCubit.get(context).turnAllACsOff();
},
child: Container(
height: 60,
decoration: BoxDecoration(
color: DevicesCubit.categories[0].devicesStatus
? Colors.white
: ColorsManager.primaryColor,
borderRadius: const BorderRadius.only(
topRight: Radius.circular(15),
bottomRight: Radius.circular(15),
),
),
child: Center(
child: BodyMedium(
text: "OFF",
fontColor: DevicesCubit.categories[0].devicesStatus
? null
: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
),
),
),
),
],
],
);
},
);
}
}
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/devices/bloc/ac_cubit.dart';
import 'package:syncrow_app/utils/context_extension.dart';
@@ -15,45 +16,48 @@ class UniversalACTemp extends StatelessWidget {
@override
Widget build(BuildContext context) {
double averageTemp = AcCubit.get(context).averageTempForAll();
return DefaultContainer(
height: 60,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
SizedBox.square(
dimension: 24,
child: InkWell(
onTap: () {
AcCubit.get(context).setTempToAll(averageTemp + .5);
},
child: SvgPicture.asset(
Assets.iconsMinus,
return BlocBuilder<AcCubit, AcState>(
builder: (context, state) {
return DefaultContainer(
height: 60,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
SizedBox.square(
dimension: 24,
child: InkWell(
onTap: () {
AcCubit.get(context).setTempToAll(AcCubit.averageTemp + .5);
},
child: SvgPicture.asset(
Assets.iconsMinus,
),
),
),
),
),
BodyLarge(
text: "${AcCubit.get(context).averageTempForAll()}° C",
style: context.bodyLarge.copyWith(
color: ColorsManager.primaryColor.withOpacity(0.6),
fontSize: 23,
),
),
SizedBox.square(
dimension: 24,
child: InkWell(
onTap: () {
AcCubit.get(context).setTempToAll(averageTemp + .5);
},
child: SvgPicture.asset(
Assets.iconsPlus,
height: 24,
width: 24,
BodyLarge(
text: "${AcCubit.averageTemp}° C",
style: context.bodyLarge.copyWith(
color: ColorsManager.primaryColor.withOpacity(0.6),
fontSize: 23,
),
),
),
SizedBox.square(
dimension: 24,
child: InkWell(
onTap: () {
AcCubit.get(context).setTempToAll(AcCubit.averageTemp + .5);
},
child: SvgPicture.asset(
Assets.iconsPlus,
height: 24,
width: 24,
),
),
),
],
),
],
),
);
},
);
}
}
@@ -31,17 +31,19 @@ class CategoriesView extends StatelessWidget {
),
Expanded(
flex: 3,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TitleMedium(
text: StringsManager.wizard,
style: TextStyle(
fontSize: 28,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TitleMedium(
text: StringsManager.wizard,
style: TextStyle(
fontSize: 28,
),
),
),
Switches(),
],
Switches(),
],
),
),
)
],
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_app/features/devices/model/ac_model.dart';
import 'package:syncrow_app/features/devices/bloc/ac_cubit.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/utils/context_extension.dart';
@@ -8,21 +8,15 @@ import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
import '../../../../generated/assets.dart';
class DevicesTempWidget extends StatefulWidget {
const DevicesTempWidget({
class DevicesTempWidget extends StatelessWidget {
const DevicesTempWidget(
this.index, {
super.key,
required this.model,
});
final ACModel model;
final int index;
@override
State<DevicesTempWidget> createState() => _DevicesTempWidgetState();
}
class _DevicesTempWidgetState extends State<DevicesTempWidget> {
// double temp = widget.model.temperature;
@override
Widget build(BuildContext context) {
return DefaultContainer(
@@ -34,10 +28,7 @@ class _DevicesTempWidgetState extends State<DevicesTempWidget> {
dimension: 24,
child: InkWell(
onTap: () {
setState(() {
// temp = temp - .5;
widget.model.temperature = widget.model.temperature - .5;
});
AcCubit.get(context).decreaseACTemp(index);
},
child: SvgPicture.asset(
Assets.iconsMinus,
@@ -45,7 +36,7 @@ class _DevicesTempWidgetState extends State<DevicesTempWidget> {
),
),
BodyLarge(
text: "${widget.model.temperature}° C",
text: "${AcCubit.get(context).getTemp(index)}° C",
style: context.bodyLarge.copyWith(
color: ColorsManager.primaryColor.withOpacity(0.6),
fontSize: 23,
@@ -55,10 +46,7 @@ class _DevicesTempWidgetState extends State<DevicesTempWidget> {
dimension: 24,
child: InkWell(
onTap: () {
setState(() {
// temp = temp + .5
widget.model.temperature = widget.model.temperature + .5;
});
AcCubit.get(context).increaseACTemp(index);
},
child: SvgPicture.asset(
Assets.iconsPlus,
@@ -17,7 +17,7 @@ class DevicesViewBody extends StatelessWidget {
builder: (context, state) {
return state is DevicesLoading
? const Center(child: CircularProgressIndicator())
: DevicesCubit.get(context).chosenCategory ??
: DevicesCubit.get(context).chosenCategoryView ??
const CategoriesView();
},
),
+19 -11
View File
@@ -4,7 +4,7 @@ import 'package:flutter_svg/svg.dart';
import 'package:syncrow_app/features/shared_widgets/custom_switch.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.dart';
import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart';
import 'package:syncrow_app/utils/resource_manager/font_manager.dart';
import 'package:syncrow_app/utils/context_extension.dart';
import '../../bloc/devices_cubit.dart';
@@ -30,11 +30,10 @@ class Switches extends StatelessWidget {
itemCount: DevicesCubit.categories.length,
itemBuilder: (_, index) {
return InkWell(
onTap: () => DevicesCubit.get(context).updateCategory(index),
onTap: () => DevicesCubit.get(context).selectCategory(index),
child: DefaultContainer(
child: Padding(
padding:
const EdgeInsets.symmetric(vertical: 10, horizontal: 10),
padding: const EdgeInsets.only(top: 10, right: 10, left: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -47,15 +46,24 @@ class Switches extends StatelessWidget {
DevicesCubit.categories[index].icon,
fit: BoxFit.contain,
),
CustomSwitch(),
CustomSwitch(
category: DevicesCubit.categories[index],
),
],
),
BodyLarge(
text: DevicesCubit.categories[index].name,
fontWeight: FontsManager.bold,
fontSize: 24,
fontColor: const Color(0xFF848484),
)
Expanded(
child: FittedBox(
fit: BoxFit.scaleDown,
child: BodyLarge(
text: DevicesCubit.categories[index].name,
style: context.bodyLarge.copyWith(
fontWeight: FontWeight.bold,
height: 0,
fontSize: 24,
),
),
),
),
],
),
),