Skip to content

Commit fad8c38

Browse files
committed
migrated to dart 3
1 parent 3883b28 commit fad8c38

10 files changed

+73
-77
lines changed

pubspec.yaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ dependencies:
77
dartnissanconnect:
88
git: https://github.com/derich367/dartnissanconnect
99
dartcarwings:
10-
git: https://github.com/derich367/dartcarwings
10+
git: https://github.com/Tobiaswk/dartcarwings
1111
mqtt_client: ^9.6.1
1212
logging: ^1.0.1
13+
collection: ^1.15.0-nullsafety.4
1314
environment:
1415
sdk: ">=3.3.4 <4.0.0"

src/leaf/builder/leaf_stats_builder.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class StatsInfoBuilder extends BuilderBase {
4444
StatsInfoBuilder withCo2ReductionKg(String co2ReductionKg) =>
4545
_withSpecifiedUnitInfo('co2ReductionKg', co2ReductionKg);
4646

47-
StatsInfoBuilder withTripsNumber(int tripsNumber) =>
47+
StatsInfoBuilder withTripsNumber(int? tripsNumber) =>
4848
_withInfo('tripsNumber', tripsNumber);
4949

5050
StatsInfoBuilder withKwhGained(String kWhGained) =>

src/leaf/carwings_wrapper.dart

+11-11
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ import 'leaf_session.dart';
88
import 'leaf_vehicle.dart';
99

1010
class CarwingsWrapper extends LeafSessionInternal {
11-
CarwingsWrapper(this._region, String username, String password)
11+
CarwingsWrapper(this._region, String? username, String? password)
1212
: super(username, password);
1313

1414
final CarwingsRegion _region;
1515

16-
CarwingsSession _session;
16+
late CarwingsSession _session;
1717

1818
@override
1919
Future<void> login() async {
2020
_session = CarwingsSession();
21-
await _session.login(username: username, password: password, region: _region);
21+
await _session.login(username: username!, password: password!, region: _region);
2222

2323
final List<VehicleInternal> newVehicles = _session.vehicles.map((CarwingsVehicle vehicle) =>
2424
CarwingsVehicleWrapper(vehicle)).toList();
@@ -36,14 +36,14 @@ class CarwingsVehicleWrapper extends VehicleInternal {
3636

3737
CarwingsVehicle _getVehicle() =>
3838
_session.vehicles.firstWhere((CarwingsVehicle v) => v.vin.toString() == vin,
39-
orElse: () => throw Exception('Could not find matching vehicle: $vin number of vehicles: ${_session.vehicles.length}'));
39+
orElse: (() => throw Exception('Could not find matching vehicle: $vin number of vehicles: ${_session.vehicles.length}')) as CarwingsVehicle Function()?);
4040

4141
@override
4242
bool isFirstVehicle() => _session.vehicle.vin == vin;
4343

4444
@override
4545
Future<Map<String, String>> fetchDailyStatistics(DateTime targetDate) async {
46-
final CarwingsStatsDaily stats = await _getVehicle().requestStatisticsDaily();
46+
final CarwingsStatsDaily stats = (await _getVehicle().requestStatisticsDaily())!;
4747

4848
if (stats.electricCostScale == 'miles/kWh') {
4949
return saveAndPrependVin(StatsInfoBuilder(TimeRange.Daily)
@@ -62,7 +62,7 @@ class CarwingsVehicleWrapper extends VehicleInternal {
6262

6363
@override
6464
Future<Map<String, String>> fetchMonthlyStatistics(DateTime targetDate) async {
65-
final CarwingsStatsMonthly stats = await _getVehicle().requestStatisticsMonthly(targetDate);
65+
final CarwingsStatsMonthly stats = (await _getVehicle().requestStatisticsMonthly(targetDate))!;
6666

6767
if (stats.mileageUnit == 'km') {
6868
return saveAndPrependVin(StatsInfoBuilder(TimeRange.Monthly)
@@ -96,7 +96,7 @@ class CarwingsVehicleWrapper extends VehicleInternal {
9696

9797
@override
9898
Future<Map<String, String>> fetchBatteryStatus() async {
99-
final CarwingsBattery battery = await _getVehicle().requestBatteryStatusLatest();
99+
final CarwingsBattery battery = (await _getVehicle().requestBatteryStatusLatest())!;
100100

101101
return saveAndPrependVin(BatteryInfoBuilder()
102102
.withChargePercentage(((battery.batteryLevel * 100) / battery.batteryLevelCapacity).round())
@@ -122,8 +122,8 @@ class CarwingsVehicleWrapper extends VehicleInternal {
122122

123123
@override
124124
Future<Map<String, String>> fetchClimateStatus() async {
125-
final CarwingsCabinTemperature cabinTemperature = await _getVehicle().requestCabinTemperature();
126-
final CarwingsHVAC hvac = await _getVehicle().requestHVACStatus();
125+
final CarwingsCabinTemperature cabinTemperature = (await _getVehicle().requestCabinTemperature())!;
126+
final CarwingsHVAC hvac = (await _getVehicle().requestHVACStatus())!;
127127

128128
return saveAndPrependVin(ClimateInfoBuilder()
129129
.withCabinTemperatureCelsius(cabinTemperature.temperature)
@@ -132,7 +132,7 @@ class CarwingsVehicleWrapper extends VehicleInternal {
132132
}
133133

134134
@override
135-
Future<bool> startClimate(int targetTemperatureCelsius) async {
135+
Future<bool> startClimate(int? targetTemperatureCelsius) async {
136136
await _getVehicle().requestClimateControlOn();
137137
return true;
138138
}
@@ -145,7 +145,7 @@ class CarwingsVehicleWrapper extends VehicleInternal {
145145

146146
@override
147147
Future<Map<String, String>> fetchLocation() async {
148-
final CarwingsLocation location = await _getVehicle().requestLocation();
148+
final CarwingsLocation location = (await _getVehicle().requestLocation())!;
149149
return saveAndPrependVin(LocationInfoBuilder()
150150
.withLatitude(location.latitude)
151151
.withLongitude(location.longitude)

src/leaf/leaf_session.dart

+12-17
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:collection/collection.dart' show IterableExtension;
12
import 'package:dartcarwings/dartcarwings.dart';
23
import 'package:logging/logging.dart';
34

@@ -17,31 +18,25 @@ enum LeafType {
1718
olderJapan,
1819
}
1920

20-
LeafSession createLeafSession(LeafType leafType, String username, String password) {
21+
LeafSession createLeafSession(LeafType? leafType, String? username, String? password) {
2122
switch (leafType) {
2223
case LeafType.newerThanMay2019:
2324
return NissanConnectSessionWrapper(username, password);
24-
break;
2525

2626
case LeafType.olderCanada:
2727
return NissanConnectNASessionWrapper('CA', username, password);
28-
break;
2928

3029
case LeafType.olderUsa:
3130
return NissanConnectNASessionWrapper('US', username, password);
32-
break;
3331

3432
case LeafType.olderEurope:
3533
return CarwingsWrapper(CarwingsRegion.Europe, username, password);
36-
break;
3734

3835
case LeafType.olderJapan:
3936
return CarwingsWrapper(CarwingsRegion.Japan, username, password);
40-
break;
4137

4238
case LeafType.olderAustralia:
4339
return CarwingsWrapper(CarwingsRegion.Australia, username, password);
44-
break;
4540

4641
default:
4742
throw ArgumentError.value(leafType, 'leafType', 'this LeafType is not supported yet.');
@@ -51,8 +46,8 @@ LeafSession createLeafSession(LeafType leafType, String username, String passwor
5146
abstract class LeafSessionInternal extends LeafSession {
5247
LeafSessionInternal(this.username, this.password);
5348

54-
final String username;
55-
final String password;
49+
final String? username;
50+
final String? password;
5651

5752
List<VehicleInternal> _lastKnownVehicles = <VehicleInternal>[];
5853

@@ -62,8 +57,8 @@ abstract class LeafSessionInternal extends LeafSession {
6257
void setVehicles(List<VehicleInternal> newVehicles) {
6358
// keep the last states
6459
for (final VehicleInternal lastKnownVehicle in _lastKnownVehicles) {
65-
final VehicleInternal matchingVehicle =
66-
newVehicles.firstWhere((VehicleInternal vehicle) => vehicle.vin == lastKnownVehicle.vin, orElse: () => null);
60+
final VehicleInternal? matchingVehicle =
61+
newVehicles.firstWhereOrNull((VehicleInternal vehicle) => vehicle.vin == lastKnownVehicle.vin);
6762
matchingVehicle?.setLastKnownStatus(lastKnownVehicle);
6863
}
6964

@@ -85,19 +80,19 @@ typedef ExecutableVehicleActionHandler<T> = Future<T> Function(Vehicle vehicle);
8580
typedef SyncExecutableVehicleActionHandler<T> = T Function(Vehicle vehicle);
8681
abstract class LeafSession {
8782

88-
ExecutionErrorCallback onExecutionError;
83+
ExecutionErrorCallback? onExecutionError;
8984

9085
List<Vehicle> get vehicles;
9186

9287
Vehicle _getVehicle(String vin) =>
9388
vehicles.firstWhere((Vehicle vehicle) => vehicle.vin == vin,
94-
orElse: () => throw Exception('Vehicle $vin not found.'));
89+
orElse: (() => throw Exception('Vehicle $vin not found.')) as Vehicle Function()?);
9590

9691
Future<void> login();
9792

9893
Map<String, String> getAllLastKnownStatus();
9994

100-
T executeSync<T>(SyncExecutableVehicleActionHandler<T> executable, String vin) {
95+
T? executeSync<T>(SyncExecutableVehicleActionHandler<T> executable, String vin) {
10196
try {
10297
return executable(_getVehicle(vin));
10398
} catch (e, stackTrace) {
@@ -120,17 +115,17 @@ abstract class LeafSession {
120115
}
121116

122117
if (!anyCommandSucceeded && onExecutionError != null) {
123-
onExecutionError(vin);
118+
onExecutionError!(vin);
124119
}
125120
}
126121

127-
Future<T> executeWithRetry<T>(ExecutableVehicleActionHandler<T> executable, String vin) async {
122+
Future<T?> executeWithRetry<T>(ExecutableVehicleActionHandler<T> executable, String vin) async {
128123
try {
129124
return await _executeWithRetry(executable, vin);
130125
} catch(e, stackTrace) {
131126
_logException(e, stackTrace);
132127
if (onExecutionError != null) {
133-
onExecutionError(vin);
128+
onExecutionError!(vin);
134129
}
135130
}
136131

src/leaf/leaf_vehicle.dart

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:convert';
2+
import 'package:collection/collection.dart' show IterableExtension;
23

34
abstract class VehicleInternal extends Vehicle {
45
VehicleInternal(String nickname, String vin) : super(vin) {
@@ -43,17 +44,17 @@ abstract class Vehicle {
4344
bool get isCharging =>
4445
_findValueOfKeyIn(_lastKnownStatus, 'charging') == 'true';
4546

46-
String _findValueOfKeyIn(Map<String, String> status, String key) {
47-
return status.entries.firstWhere(
47+
String? _findValueOfKeyIn(Map<String, String> status, String key) {
48+
return status.entries.firstWhereOrNull(
4849
(MapEntry<String, String> status) =>
49-
status.key.endsWith(key), orElse: () => null)?.value;
50+
status.key.endsWith(key))?.value;
5051
}
5152

5253
final Map<String, String> _lastKnownStatus = <String, String>{};
5354
Map<String, String> getLastKnownStatus();
5455

55-
Map<String, String> getVehicleStatus() {
56-
final Map<String, String> info = <String, String>{
56+
Map<String, String?> getVehicleStatus() {
57+
final Map<String, String?> info = <String, String?>{
5758
'nickname': _lastKnownStatus['nickname'],
5859
'vin': _lastKnownStatus['vin'],
5960
};
@@ -69,7 +70,7 @@ abstract class Vehicle {
6970
Future<bool> startCharging();
7071

7172
Future<Map<String, String>> fetchClimateStatus();
72-
Future<bool> startClimate(int targetTemperatureCelsius);
73+
Future<bool> startClimate(int? targetTemperatureCelsius);
7374
Future<bool> stopClimate();
7475

7576
Future<Map<String, String>> fetchLocation();

src/leaf/nissan_connect_na_wrapper.dart

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ import 'leaf_vehicle.dart';
1111
final Logger _log = Logger('NissanConnectNASessionWrapper');
1212

1313
class NissanConnectNASessionWrapper extends LeafSessionInternal {
14-
NissanConnectNASessionWrapper(this._countryCode, String username, String password)
14+
NissanConnectNASessionWrapper(this._countryCode, String? username, String? password)
1515
: super(username, password);
1616

17-
NissanConnectSession _session;
17+
late NissanConnectSession _session;
1818
final String _countryCode;
1919

2020
@override
2121
Future<void> login() async {
2222
_session = NissanConnectSession(debug: _log.level <= Level.FINER);
2323
const String fakeAndroidUserAgent = 'Dalvik/2.1.0 (Linux; U; Android 5.1.1; Android SDK built for x86 Build/LMY48X)';
24-
await _session.login(username: username, password: password, countryCode: _countryCode, userAgent: fakeAndroidUserAgent);
24+
await _session.login(username: username!, password: password!, countryCode: _countryCode, userAgent: fakeAndroidUserAgent);
2525

2626
final List<VehicleInternal> newVehicles = _session.vehicles.map((NissanConnectVehicle vehicle) =>
2727
NissanConnectNAVehicleWrapper(vehicle)).toList();
@@ -39,7 +39,7 @@ class NissanConnectNAVehicleWrapper extends VehicleInternal {
3939

4040
NissanConnectVehicle _getVehicle() =>
4141
_session.vehicles.firstWhere((NissanConnectVehicle v) => v.vin.toString() == vin,
42-
orElse: () => throw Exception('Could not find matching vehicle: $vin number of vehicles: ${_session.vehicles.length}'));
42+
orElse: (() => throw Exception('Could not find matching vehicle: $vin number of vehicles: ${_session.vehicles.length}')) as NissanConnectVehicle Function()?);
4343

4444
@override
4545
bool isFirstVehicle() => _session.vehicle.vin == vin;
@@ -94,11 +94,11 @@ class NissanConnectNAVehicleWrapper extends VehicleInternal {
9494
Future<Map<String, String>> fetchClimateStatus() =>
9595
Future<Map<String, String>>.value(
9696
saveAndPrependVin(ClimateInfoBuilder()
97-
.withCabinTemperatureCelsius(_getVehicle().incTemperature)
97+
.withCabinTemperatureCelsius(_getVehicle().incTemperature!)
9898
.build()));
9999

100100
@override
101-
Future<bool> startClimate(int targetTemperatureCelsius) =>
101+
Future<bool> startClimate(int? targetTemperatureCelsius) =>
102102
_getVehicle().requestClimateControlOn(DateTime.now());
103103

104104
@override

src/leaf/nissan_connect_wrapper.dart

+7-7
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ import 'leaf_session.dart';
1010
import 'leaf_vehicle.dart';
1111

1212
class NissanConnectSessionWrapper extends LeafSessionInternal {
13-
NissanConnectSessionWrapper(String username, String password)
13+
NissanConnectSessionWrapper(String? username, String? password)
1414
: super(username, password);
1515

16-
NissanConnectSession _session;
16+
late NissanConnectSession _session;
1717

1818
@override
1919
Future<void> login() async {
2020
_session = NissanConnectSession();
21-
await _session.login(username: username, password: password);
21+
await _session.login(username: username!, password: password!);
2222

2323
final List<VehicleInternal> newVvehicles = _session.vehicles.map((NissanConnectVehicle vehicle) =>
2424
NissanConnectVehicleWrapper(vehicle)).toList();
@@ -36,7 +36,7 @@ class NissanConnectVehicleWrapper extends VehicleInternal {
3636

3737
NissanConnectVehicle _getVehicle() =>
3838
_session.vehicles.firstWhere((NissanConnectVehicle v) => v.vin.toString() == vin,
39-
orElse: () => throw Exception('Could not find matching vehicle: $vin number of vehicles: ${_session.vehicles.length}'));
39+
orElse: (() => throw Exception('Could not find matching vehicle: $vin number of vehicles: ${_session.vehicles.length}')) as NissanConnectVehicle Function()?);
4040

4141
@override
4242
bool isFirstVehicle() => _session.vehicle.vin == vin;
@@ -68,7 +68,7 @@ class NissanConnectVehicleWrapper extends VehicleInternal {
6868
Future<Map<String, String>> fetchBatteryStatus() async {
6969
final NissanConnectBattery battery = await _getVehicle().requestBatteryStatus();
7070

71-
final int percentage =
71+
final int? percentage =
7272
double.tryParse(battery.batteryPercentage.replaceFirst('%', ''))?.round();
7373

7474
return saveAndPrependVin(BatteryInfoBuilder()
@@ -105,10 +105,10 @@ class NissanConnectVehicleWrapper extends VehicleInternal {
105105
}
106106

107107
@override
108-
Future<bool> startClimate(int targetTemperatureCelsius) =>
108+
Future<bool> startClimate(int? targetTemperatureCelsius) =>
109109
_getVehicle().requestClimateControlOn(
110110
DateTime.now(),
111-
targetTemperatureCelsius);
111+
targetTemperatureCelsius!);
112112

113113
@override
114114
Future<bool> stopClimate() =>

src/leaf_2_mqtt

6.54 MB
Binary file not shown.

0 commit comments

Comments
 (0)