@immutable
class Vehicle {
final double speed;
+ final double engineSpeed;
final double insideTemperature;
final double outsideTemperature;
final int range;
final int mediaVolume;
final bool isChildLockActiveLeft;
final bool isChildLockActiveRight;
- final double engineSpeed;
final int frontLeftTire;
final int frontRightTire;
final int rearLeftTire;
final int fanSpeed;
final int driverTemperature;
final int passengerTemperature;
+ final bool temperatureSynced;
const Vehicle(
this.speed,
+ this.engineSpeed,
this.insideTemperature,
this.outsideTemperature,
this.range,
this.mediaVolume,
this.isChildLockActiveLeft,
this.isChildLockActiveRight,
- this.engineSpeed,
this.frontLeftTire,
this.frontRightTire,
this.rearLeftTire,
this.isFrontDefrosterActive,
this.isRearDefrosterActive,
this.isRecirculationActive,
- this.fanSpeed,
- this.driverTemperature,
- this.passengerTemperature,
+ this.fanSpeed,
+ this.driverTemperature,
+ this.passengerTemperature,
+ this.temperatureSynced,
);
const Vehicle.initial()
: speed = 0,
+ engineSpeed = 0,
insideTemperature = 0,
outsideTemperature = 0,
range = 0,
mediaVolume = 50,
isChildLockActiveLeft = false,
isChildLockActiveRight = true,
- engineSpeed = 0,
frontLeftTire = 33,
frontRightTire = 31,
rearLeftTire = 31,
isRecirculationActive = false,
fanSpeed = 0,
driverTemperature = 26,
- passengerTemperature = 26;
+ passengerTemperature = 26,
+ temperatureSynced = true;
const Vehicle.initialForDebug()
: speed = 60,
+ engineSpeed = 6500,
insideTemperature = 25,
outsideTemperature = 32.0,
range = 21,
mediaVolume = 50,
isChildLockActiveLeft = false,
isChildLockActiveRight = true,
- engineSpeed = 6500,
frontLeftTire = 33,
frontRightTire = 31,
rearLeftTire = 31,
isRecirculationActive = false,
fanSpeed = 0,
driverTemperature = 26,
- passengerTemperature = 26;
+ passengerTemperature = 26,
+ temperatureSynced = true;
Vehicle copyWith(
{double? speed,
+ double? engineSpeed,
double? insideTemperature,
double? outsideTemperature,
int? range,
int? mediaVolume,
bool? isChildLockActiveLeft,
bool? isChildLockActiveRight,
- double? engineSpeed,
int? frontLeftTire,
int? frontRightTire,
int? rearLeftTire,
bool? isFrontDefrosterActive,
bool? isRearDefrosterActive,
bool? isRecirculationActive,
- int? fanSpeed,
- int? driverTemperature,
- int? passengerTemperature,
+ int? fanSpeed,
+ int? driverTemperature,
+ int? passengerTemperature,
+ bool? temperatureSynced,
}) {
return Vehicle(
speed ?? this.speed,
+ engineSpeed ?? this.engineSpeed,
insideTemperature ?? this.insideTemperature,
outsideTemperature ?? this.outsideTemperature,
range ?? this.range,
mediaVolume ?? this.mediaVolume,
isChildLockActiveLeft ?? this.isChildLockActiveLeft,
isChildLockActiveRight ?? this.isChildLockActiveRight,
- engineSpeed ?? this.engineSpeed,
frontLeftTire ?? this.frontLeftTire,
frontRightTire ?? this.frontRightTire,
rearLeftTire ?? this.rearLeftTire,
isFrontDefrosterActive ?? this.isFrontDefrosterActive,
isRearDefrosterActive ?? this.isRearDefrosterActive,
isRecirculationActive ?? this.isRecirculationActive,
- fanSpeed ?? this.fanSpeed,
- driverTemperature ?? this.driverTemperature,
- passengerTemperature ?? this.passengerTemperature,
+ fanSpeed ?? this.fanSpeed,
+ driverTemperature ?? this.driverTemperature,
+ passengerTemperature ?? this.passengerTemperature,
+ temperatureSynced ?? this.temperatureSynced,
);
}
Map<String, dynamic> toMap() {
return {
'speed': speed,
+ 'engineSpeed': engineSpeed,
'insideTemperature': insideTemperature,
'outsideTemperature': outsideTemperature,
'range': range,
'mediaVolume': mediaVolume,
'isChildLockActiveLeft': isChildLockActiveLeft,
'isChildLockActiveRight': isChildLockActiveRight,
- 'engineSpeed': engineSpeed,
'frontLeftTire': frontLeftTire,
'frontRightTire': frontRightTire,
'rearLeftTire': rearLeftTire,
'fanSpeed': fanSpeed,
'driverTemperature': driverTemperature,
'passengerTemperature': passengerTemperature,
+ 'temperatureSynced': temperatureSynced,
};
}
factory Vehicle.fromMap(Map<String, dynamic> map) {
return Vehicle(
map['speed']?.toDouble() ?? 0.0,
+ map['engineSpeed']?.toDouble() ?? 0.0,
map['insideTemperature']?.toDouble() ?? 0.0,
map['outsideTemperature']?.toDouble() ?? 0.0,
map['range']?.toInt() ?? 0,
map['mediaVolume']?.toInt() ?? 0,
map['isChildLockActiveLeft'] ?? false,
map['isChildLockActiveRight'] ?? false,
- map['engineSpeed']?.toInt() ?? 0,
map['frontLeftTire']?.toInt() ?? 0,
map['frontRightTire']?.toInt() ?? 0,
map['rearLeftTire']?.toInt() ?? 0,
map['fanSpeed'] ?? 0,
map['driverTemperature'] ?? 0,
map['passengerTemperature'] ?? 0,
+ map['temperatureSynced'] ?? false,
);
}
other.isRecirculationActive == isRecirculationActive &&
other.fanSpeed == fanSpeed &&
other.driverTemperature == driverTemperature &&
- other.passengerTemperature == passengerTemperature;
+ other.passengerTemperature == passengerTemperature &&
+ other.temperatureSynced == temperatureSynced;
}
@override
isRecirculationActive.hashCode ^
fanSpeed.hashCode ^
driverTemperature.hashCode ^
- passengerTemperature.hashCode;
+ passengerTemperature.hashCode ^
+ temperatureSynced.hashCode;
}
// }
// / class VehicleNotifier extends StateNotifier<Vehicle> {
bool isFanFocusLeftBottomSelected = true;
bool isFanFocusRightBottomSelected = false;
- late bool isACSelected;
- bool isSYNCSelected = true;
- late bool isFrontDefrostSelected;
bool isAutoSelected = true;
- late bool isRecirculationSelected;
- late bool isRearDefrostSelected;
- int temperatureLeft = 26;
- int temperatureRight = 26;
@override
void initState() {
super.initState();
@override
Widget build(BuildContext context) {
- final vehicle = ref.watch(vehicleProvider.select((vehicle) => vehicle));
- isACSelected = vehicle.isAirConditioningActive;
- isFrontDefrostSelected = vehicle.isFrontDefrosterActive;
- isRearDefrostSelected = vehicle.isRearDefrosterActive;
- isRecirculationSelected = vehicle.isRecirculationActive;
+ bool isACSelected = ref.watch(vehicleProvider.select((vehicle) => vehicle.isAirConditioningActive));
+ bool isFrontDefrostSelected = ref.watch(vehicleProvider.select((vehicle) => vehicle.isFrontDefrosterActive));
+ bool isRearDefrostSelected = ref.watch(vehicleProvider.select((vehicle) => vehicle.isRearDefrosterActive));
+ bool isRecirculationSelected = ref.watch(vehicleProvider.select((vehicle) => vehicle.isRecirculationActive));
+ bool isSYNCSelected = ref.watch(vehicleProvider.select((vehicle) => vehicle.temperatureSynced));
Size size = MediaQuery.sizeOf(context);
- temperatureLeft = vehicle.driverTemperature;
- temperatureRight = vehicle.passengerTemperature;
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
- TemperatureControl(
- temperature: temperatureLeft,
- side: Side.left,
- ),
- TemperatureControl(
- temperature: temperatureRight,
- side: Side.right,
- )
+ TemperatureControl(side: Side.left),
+ TemperatureControl(side: Side.right)
],
),
const SizedBox(
)),
ClimateControls(
onPressed: () {
- setState(() {
- isSYNCSelected = !isSYNCSelected;
- });
+ if (!isSYNCSelected) {
+ int temperature = ref.read(vehicleProvider.select((vehicle) => vehicle.driverTemperature));
+ ref
+ .read(vehicleProvider.notifier)
+ .setTemperature(side: Side.right, value: temperature);
+ }
+ ref
+ .read(vehicleProvider.notifier)
+ .setTemperatureSynced(!isSYNCSelected);
},
isSelected: isSYNCSelected,
child: Text(
class TemperatureControl extends ConsumerStatefulWidget {
const TemperatureControl(
- {super.key, required this.temperature, required this.side});
- final int temperature;
+ {super.key, required this.side});
final Side side;
@override
class TemperatureControlState extends ConsumerState<TemperatureControl> {
late Timer tempButtonTimer;
- int temperature = 0;
bool isUpButtonHighlighted = false;
bool isDownButtonHighlighted = false;
- @override
- void initState() {
- super.initState();
- setState(() {
- temperature = widget.temperature;
- });
- }
-
onPressed({required String type, required Side side}) {
- setState(() {
- if (type == "add") {
- temperature = temperature + 1;
- } else if (type == "subtract") {
- temperature = temperature - 1;
- }
- // limit the temperature to 60-100F
- if (temperature <= 15) {
- temperature = 15;
- } else if (temperature >= 38) {
- temperature = 38;
- }
- if (widget.side == Side.left) {
+ int temperature = 0;
+ if (side == Side.left) {
+ temperature = ref.read(vehicleProvider.select((vehicle) => vehicle.driverTemperature));
+ } else {
+ temperature = ref.read(vehicleProvider.select((vehicle) => vehicle.passengerTemperature));
+ }
+ if (type == "add") {
+ temperature = temperature + 1;
+ } else if (type == "subtract") {
+ temperature = temperature - 1;
+ }
+ // limit the temperature to 60-100F
+ if (temperature <= 15) {
+ temperature = 15;
+ } else if (temperature >= 38) {
+ temperature = 38;
+ }
+ bool isSynced = ref.read(vehicleProvider.select((vehicle) => vehicle.temperatureSynced));
+ if (widget.side == Side.left) {
+ ref
+ .read(vehicleProvider.notifier)
+ .setTemperature(side: Side.left, value: temperature);
+ if (isSynced) {
ref
.read(vehicleProvider.notifier)
- .setTemperature(side: Side.left, value: temperature);
- } else {
+ .setTemperature(side: Side.right, value: temperature);
+ }
+ } else {
+ if (isSynced) {
ref
.read(vehicleProvider.notifier)
- .setTemperature(side: Side.right, value: temperature);
+ .setTemperatureSynced(false);
}
- });
+ ref
+ .read(vehicleProvider.notifier)
+ .setTemperature(side: Side.right, value: temperature);
+ }
}
@override
Widget build(BuildContext context) {
- //final temperature = ref.watch(vehicleProvider.select((vehicle) => vehicle));
- // final outsideTemperature = ref
- // .watch(vehicleProvider.select((vehicle) => vehicle.outsideTemperature));
+ int temperature = 0;
+ if (widget.side == Side.left) {
+ temperature = ref.watch(vehicleProvider.select((vehicle) => vehicle.driverTemperature));
+ } else {
+ temperature = ref.watch(vehicleProvider.select((vehicle) => vehicle.passengerTemperature));
+ }
final tempUnit =
ref.watch(unitStateProvider.select((unit) => unit.temperatureUnit));