fix: resolve 78 strict analysis errors with explicit type annotations
Implemented systematic type safety improvements across the codebase to eliminate all 78 strict analysis errors: ## Phase 1: Quick Wins (Redux & Model Fixes) - Added explicit type annotations to Redux reducer parameters - Fixed copyWith() methods in FireNotification and YourLocation models with proper nullable types - Fixed BasicLocation field initializers with type casts (num to double) - Fixed context parameter inference in IntroPage and PrivacyPage - Regenerated .g.dart files with build_runner ## Phase 2: JSON Deserialization - Fixed homePage.dart Firebase message parameter casting (9 errors) - Fixed firesApi.dart JSON parsing: - Added explicit casts for num to double/int conversions - Fixed array iteration with proper List<dynamic> casting - Added return type annotation to objectIdFromJson() - Fixed nested JSON access in getMonitoredAreas() - Fixed globalFiresBottomStats.dart dynamic to int/String casting - Fixed locationUtils.dart string assignments ## Phase 3: Config & Redux Middleware - Fixed mainCommon.dart config map access with explicit String casts - Fixed mainProd.dart Sentry DSN casting - Fixed fetchDataMiddleware.dart: - Added Store<AppState>, String type annotations to createUser() - Added Function(YourLocation) type to subscribeViaApi callback - Added Exception type to catchError handler - Fixed fireMapReducer.dart restoreStatusAfterSave parameter type - Fixed persist files with Map<String, dynamic> type annotations ## Phase 4: Edge Cases - Fixed slider.dart method return types (Widget sizeText, Widget warningText) - Fixed mainDrawer.dart Key? parameter type annotation Result: 78 errors → 0 errors
This commit is contained in:
parent
989238bf76
commit
1864e5b105
24 changed files with 153 additions and 114 deletions
|
|
@ -6,27 +6,31 @@ part of 'appState.dart';
|
|||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
AppState _$AppStateFromJson(Map json) {
|
||||
return $checkedNew('AppState', json, () {
|
||||
final val = AppState(
|
||||
yourLocations: $checkedConvert(
|
||||
json,
|
||||
'yourLocations',
|
||||
(v) => (v as List)
|
||||
.map((e) =>
|
||||
YourLocation.fromJson(Map<String, dynamic>.from(e as Map)))
|
||||
.toList()),
|
||||
fireNotifications: $checkedConvert(
|
||||
json,
|
||||
'fireNotifications',
|
||||
(v) => (v as List)
|
||||
.map((e) => FireNotification.fromJson(
|
||||
Map<String, dynamic>.from(e as Map)))
|
||||
.toList()),
|
||||
AppState _$AppStateFromJson(Map json) => $checkedCreate(
|
||||
'AppState',
|
||||
json,
|
||||
($checkedConvert) {
|
||||
final val = AppState(
|
||||
yourLocations: $checkedConvert(
|
||||
'yourLocations',
|
||||
(v) =>
|
||||
(v as List<dynamic>?)
|
||||
?.map((e) => YourLocation.fromJson(
|
||||
Map<String, dynamic>.from(e as Map)))
|
||||
.toList() ??
|
||||
const <YourLocation>[]),
|
||||
fireNotifications: $checkedConvert(
|
||||
'fireNotifications',
|
||||
(v) =>
|
||||
(v as List<dynamic>?)
|
||||
?.map((e) => FireNotification.fromJson(
|
||||
Map<String, dynamic>.from(e as Map)))
|
||||
.toList() ??
|
||||
const <FireNotification>[]),
|
||||
);
|
||||
return val;
|
||||
},
|
||||
);
|
||||
return val;
|
||||
});
|
||||
}
|
||||
|
||||
Map<String, dynamic> _$AppStateToJson(AppState instance) => <String, dynamic>{
|
||||
'yourLocations': instance.yourLocations.map((e) => e.toJson()).toList(),
|
||||
|
|
|
|||
|
|
@ -21,9 +21,9 @@ class BasicLocation implements Comparable<BasicLocation> {
|
|||
}
|
||||
|
||||
BasicLocation.fromJson(Map<String, dynamic> json)
|
||||
: lat = json['lat'],
|
||||
lon = json['lon'],
|
||||
description = json['description'];
|
||||
: lat = (json['lat'] as num).toDouble(),
|
||||
lon = (json['lon'] as num).toDouble(),
|
||||
description = json['description'] as String?;
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'lat': lat,
|
||||
|
|
|
|||
|
|
@ -34,7 +34,14 @@ class FireNotification {
|
|||
required this.subsId}) {}
|
||||
|
||||
FireNotification copyWith(
|
||||
{id, lat, lon, description, read, when, sealed, subsId}) {
|
||||
{ObjectId? id,
|
||||
double? lat,
|
||||
double? lon,
|
||||
String? description,
|
||||
bool? read,
|
||||
DateTime? when,
|
||||
String? sealed,
|
||||
ObjectId? subsId}) {
|
||||
return new FireNotification(
|
||||
id: id ?? this.id,
|
||||
lat: lat ?? this.lat,
|
||||
|
|
|
|||
|
|
@ -6,22 +6,24 @@ part of 'fireNotification.dart';
|
|||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
FireNotification _$FireNotificationFromJson(Map json) {
|
||||
return $checkedNew('FireNotification', json, () {
|
||||
final val = FireNotification(
|
||||
id: $checkedConvert(json, 'id', (v) => objectIdFromJson(v as String)),
|
||||
lat: $checkedConvert(json, 'lat', (v) => (v as num).toDouble()),
|
||||
lon: $checkedConvert(json, 'lon', (v) => (v as num).toDouble()),
|
||||
description: $checkedConvert(json, 'description', (v) => v as String),
|
||||
when: $checkedConvert(json, 'when', (v) => DateTime.parse(v as String)),
|
||||
read: $checkedConvert(json, 'read', (v) => v as bool),
|
||||
sealed: $checkedConvert(json, 'sealed', (v) => v as String),
|
||||
subsId:
|
||||
$checkedConvert(json, 'subsId', (v) => objectIdFromJson(v as String)),
|
||||
FireNotification _$FireNotificationFromJson(Map json) => $checkedCreate(
|
||||
'FireNotification',
|
||||
json,
|
||||
($checkedConvert) {
|
||||
final val = FireNotification(
|
||||
id: $checkedConvert('id', (v) => objectIdFromJson(v as String)),
|
||||
lat: $checkedConvert('lat', (v) => (v as num).toDouble()),
|
||||
lon: $checkedConvert('lon', (v) => (v as num).toDouble()),
|
||||
description: $checkedConvert('description', (v) => v as String),
|
||||
when: $checkedConvert('when', (v) => DateTime.parse(v as String)),
|
||||
read: $checkedConvert('read', (v) => v as bool),
|
||||
sealed: $checkedConvert('sealed', (v) => v as String),
|
||||
subsId:
|
||||
$checkedConvert('subsId', (v) => objectIdFromJson(v as String)),
|
||||
);
|
||||
return val;
|
||||
},
|
||||
);
|
||||
return val;
|
||||
});
|
||||
}
|
||||
|
||||
Map<String, dynamic> _$FireNotificationToJson(FireNotification instance) =>
|
||||
<String, dynamic>{
|
||||
|
|
|
|||
|
|
@ -13,9 +13,9 @@ Future<List<FireNotification>> loadFireNotifications() async {
|
|||
List<String>? FireNotifications = prefs.getStringList(fireNotificationKey);
|
||||
List<FireNotification> persistedList = [];
|
||||
(FireNotifications ?? []).forEach((notificationString) {
|
||||
Map notificationMap = json.decode(notificationString);
|
||||
persistedList.add(
|
||||
FireNotification.fromJson(notificationMap as Map<String, dynamic>));
|
||||
Map<String, dynamic> notificationMap =
|
||||
json.decode(notificationString) as Map<String, dynamic>;
|
||||
persistedList.add(FireNotification.fromJson(notificationMap));
|
||||
});
|
||||
return persistedList;
|
||||
});
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ class FiresApi {
|
|||
|
||||
Future<String> createUser(
|
||||
AppState state, String mobileToken, String lang) async {
|
||||
|
||||
final params = {
|
||||
"token": state.firesApiKey,
|
||||
"mobileToken": mobileToken,
|
||||
|
|
@ -32,7 +31,7 @@ class FiresApi {
|
|||
try {
|
||||
final response = await _dio.post(url, data: params);
|
||||
if (response.statusCode == 200) {
|
||||
return response.data['data']['userId'];
|
||||
return response.data['data']['userId'] as String;
|
||||
} else {
|
||||
throw "Unexpected error on create user";
|
||||
}
|
||||
|
|
@ -49,18 +48,19 @@ class FiresApi {
|
|||
try {
|
||||
final response = await _dio.get(url);
|
||||
if (response.statusCode == 200) {
|
||||
final dataSubscriptions = response.data['data']['subscriptions'];
|
||||
final dataSubscriptions =
|
||||
response.data['data']['subscriptions'] as List<dynamic>;
|
||||
List<YourLocation> subscribed = [];
|
||||
for (int i = 0; i < dataSubscriptions.length; i++) {
|
||||
var el = dataSubscriptions[i];
|
||||
var lat = el['location']['lat'];
|
||||
var lon = el['location']['lon'];
|
||||
var el = dataSubscriptions[i] as Map<String, dynamic>;
|
||||
var lat = (el['location']['lat'] as num).toDouble();
|
||||
var lon = (el['location']['lon'] as num).toDouble();
|
||||
subscribed.add(YourLocation(
|
||||
id: objectIdFromJson(el['_id']['_str']),
|
||||
id: objectIdFromJson(el['_id']['_str'] as String),
|
||||
lat: lat,
|
||||
lon: lon,
|
||||
subscribed: true,
|
||||
distance: el['distance']));
|
||||
distance: (el['distance'] as num).toInt()));
|
||||
}
|
||||
return subscribed;
|
||||
} else {
|
||||
|
|
@ -84,7 +84,7 @@ class FiresApi {
|
|||
try {
|
||||
final response = await _dio.post(url, data: params);
|
||||
if (response.statusCode == 200) {
|
||||
return response.data['data']['subsId'];
|
||||
return response.data['data']['subsId'] as String;
|
||||
} else {
|
||||
print(response.data);
|
||||
throw "Unexpected error on subscribe";
|
||||
|
|
@ -123,10 +123,10 @@ class FiresApi {
|
|||
final response = await _dio.get(url);
|
||||
if (response.statusCode == 200) {
|
||||
var resultDecoded = response.data;
|
||||
int numFires = resultDecoded['real'];
|
||||
List fires = resultDecoded['fires'];
|
||||
List falsePos = resultDecoded['falsePos'];
|
||||
List industries = resultDecoded['industries'];
|
||||
int numFires = (resultDecoded['real'] as num).toInt();
|
||||
List<dynamic> fires = resultDecoded['fires'] as List<dynamic>;
|
||||
List<dynamic> falsePos = resultDecoded['falsePos'] as List<dynamic>;
|
||||
List<dynamic> industries = resultDecoded['industries'] as List<dynamic>;
|
||||
|
||||
if (globals.isDevelopment) {
|
||||
var firesCount = fires.length;
|
||||
|
|
@ -157,13 +157,18 @@ class FiresApi {
|
|||
var resultDecoded = response.data;
|
||||
List<Polyline> union = [];
|
||||
final multipolygon =
|
||||
json.decode(resultDecoded['data']['union']['value'])['geometry']
|
||||
['coordinates'];
|
||||
for (List<dynamic> polygon in multipolygon) {
|
||||
for (List<dynamic> hole in polygon) {
|
||||
(json.decode(resultDecoded['data']['union']['value'] as String)
|
||||
as Map<String, dynamic>)['geometry']['coordinates']
|
||||
as List<dynamic>;
|
||||
for (dynamic polygonDynamic in multipolygon) {
|
||||
var polygon = polygonDynamic as List<dynamic>;
|
||||
for (dynamic holeDynamic in polygon) {
|
||||
var hole = holeDynamic as List<dynamic>;
|
||||
List<LatLng> points = [];
|
||||
for (List<dynamic> point in hole) {
|
||||
points.add(LatLng(point[1].toDouble(), point[0].toDouble()));
|
||||
for (dynamic pointDynamic in hole) {
|
||||
var point = pointDynamic as List<dynamic>;
|
||||
points.add(LatLng(
|
||||
(point[1] as num).toDouble(), (point[0] as num).toDouble()));
|
||||
}
|
||||
union.add(Polyline(points: points, color: color, strokeWidth: 3.0));
|
||||
}
|
||||
|
|
@ -178,7 +183,6 @@ class FiresApi {
|
|||
|
||||
Future<bool> markFalsePositive(AppState state, String mobileToken,
|
||||
String sealed, FalsePositiveType type) async {
|
||||
|
||||
final params = {
|
||||
"token": state.firesApiKey,
|
||||
"mobileToken": mobileToken,
|
||||
|
|
|
|||
|
|
@ -39,7 +39,13 @@ class YourLocation {
|
|||
Map<String, dynamic> toJson() => _$YourLocationToJson(this);
|
||||
|
||||
YourLocation copyWith(
|
||||
{id, lat, lon, description, distance, currentNumFires, subscribed}) {
|
||||
{ObjectId? id,
|
||||
double? lat,
|
||||
double? lon,
|
||||
String? description,
|
||||
int? distance,
|
||||
int? currentNumFires,
|
||||
bool? subscribed}) {
|
||||
return new YourLocation(
|
||||
id: id ?? this.id,
|
||||
lat: lat ?? this.lat,
|
||||
|
|
|
|||
|
|
@ -6,21 +6,25 @@ part of 'yourLocation.dart';
|
|||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
YourLocation _$YourLocationFromJson(Map json) {
|
||||
return $checkedNew('YourLocation', json, () {
|
||||
final val = YourLocation(
|
||||
id: $checkedConvert(json, 'id', (v) => objectIdFromJson(v as String)),
|
||||
lat: $checkedConvert(json, 'lat', (v) => (v as num).toDouble()),
|
||||
lon: $checkedConvert(json, 'lon', (v) => (v as num).toDouble()),
|
||||
description: $checkedConvert(json, 'description', (v) => v as String),
|
||||
distance: $checkedConvert(json, 'distance', (v) => v as int),
|
||||
currentNumFires:
|
||||
$checkedConvert(json, 'currentNumFires', (v) => v as int),
|
||||
subscribed: $checkedConvert(json, 'subscribed', (v) => v as bool),
|
||||
YourLocation _$YourLocationFromJson(Map json) => $checkedCreate(
|
||||
'YourLocation',
|
||||
json,
|
||||
($checkedConvert) {
|
||||
final val = YourLocation(
|
||||
id: $checkedConvert('id', (v) => objectIdFromJson(v as String)),
|
||||
lat: $checkedConvert('lat', (v) => (v as num).toDouble()),
|
||||
lon: $checkedConvert('lon', (v) => (v as num).toDouble()),
|
||||
description:
|
||||
$checkedConvert('description', (v) => v as String? ?? ''),
|
||||
distance:
|
||||
$checkedConvert('distance', (v) => (v as num?)?.toInt() ?? 10),
|
||||
currentNumFires:
|
||||
$checkedConvert('currentNumFires', (v) => (v as num?)?.toInt()),
|
||||
subscribed: $checkedConvert('subscribed', (v) => v as bool? ?? false),
|
||||
);
|
||||
return val;
|
||||
},
|
||||
);
|
||||
return val;
|
||||
});
|
||||
}
|
||||
|
||||
Map<String, dynamic> _$YourLocationToJson(YourLocation instance) =>
|
||||
<String, dynamic>{
|
||||
|
|
|
|||
|
|
@ -13,9 +13,9 @@ Future<List<YourLocation>> loadYourLocations() async {
|
|||
List<String>? yourLocations = prefs.getStringList(locationKey);
|
||||
List<YourLocation> persistedList = [];
|
||||
(yourLocations ?? []).forEach((locationString) {
|
||||
Map locationMap = json.decode(locationString);
|
||||
persistedList
|
||||
.add(YourLocation.fromJson(locationMap as Map<String, dynamic>));
|
||||
Map<String, dynamic> locationMap =
|
||||
json.decode(locationString) as Map<String, dynamic>;
|
||||
persistedList.add(YourLocation.fromJson(locationMap));
|
||||
});
|
||||
return persistedList;
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue