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
|
|
@ -25,12 +25,12 @@ class _GlobalFiresBottomStatsState extends State<GlobalFiresBottomStats> {
|
||||||
http.read(Uri.parse('${firesApiUrl}status/last-fire-check')).then((result) {
|
http.read(Uri.parse('${firesApiUrl}status/last-fire-check')).then((result) {
|
||||||
try {
|
try {
|
||||||
var now = Moment.now();
|
var now = Moment.now();
|
||||||
var last = DateTime.parse(json.decode(result)['value']);
|
var last = DateTime.parse(json.decode(result)['value'] as String);
|
||||||
http
|
http
|
||||||
.read(Uri.parse('${firesApiUrl}status/active-fires-count'))
|
.read(Uri.parse('${firesApiUrl}status/active-fires-count'))
|
||||||
.then((result) {
|
.then((result) {
|
||||||
try {
|
try {
|
||||||
int count = json.decode(result)['total'];
|
int count = (json.decode(result)['total'] as num).toInt();
|
||||||
setState(() {
|
setState(() {
|
||||||
lastCheck = now.from(context, last);
|
lastCheck = now.from(context, last);
|
||||||
activeFires = count;
|
activeFires = count;
|
||||||
|
|
|
||||||
|
|
@ -72,8 +72,7 @@ class _HomePageState extends State<HomePage> {
|
||||||
debugPrint(
|
debugPrint(
|
||||||
"onMessage in fireApp (isLoaded: ${store.state.isLoaded}): $message");
|
"onMessage in fireApp (isLoaded: ${store.state.isLoaded}): $message");
|
||||||
if (message.data.isNotEmpty) {
|
if (message.data.isNotEmpty) {
|
||||||
final notif = _notifForMessage(
|
final notif = _notifForMessage(message.data, store.state.isLoaded);
|
||||||
message.data, store.state.isLoaded);
|
|
||||||
if (notif != null) {
|
if (notif != null) {
|
||||||
_showItemDialog(message.data, notif);
|
_showItemDialog(message.data, notif);
|
||||||
}
|
}
|
||||||
|
|
@ -85,8 +84,7 @@ class _HomePageState extends State<HomePage> {
|
||||||
debugPrint(
|
debugPrint(
|
||||||
"onMessageOpenedApp (isLoaded: ${store.state.isLoaded}): $message");
|
"onMessageOpenedApp (isLoaded: ${store.state.isLoaded}): $message");
|
||||||
if (message.data.isNotEmpty) {
|
if (message.data.isNotEmpty) {
|
||||||
_notifForMessage(
|
_notifForMessage(message.data, store.state.isLoaded);
|
||||||
message.data, store.state.isLoaded);
|
|
||||||
_navigateToItemDetail(message.data);
|
_navigateToItemDetail(message.data);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -283,14 +281,14 @@ class _HomePageState extends State<HomePage> {
|
||||||
FireNotification? notif;
|
FireNotification? notif;
|
||||||
try {
|
try {
|
||||||
notif = new FireNotification(
|
notif = new FireNotification(
|
||||||
id: objectIdFromJson(message['id']),
|
id: objectIdFromJson(message['id'] as String),
|
||||||
subsId: objectIdFromJson(message['subsId']),
|
subsId: objectIdFromJson(message['subsId'] as String),
|
||||||
lat: double.parse(message['lat']),
|
lat: double.parse(message['lat'] as String),
|
||||||
lon: double.parse(message['lon']),
|
lon: double.parse(message['lon'] as String),
|
||||||
description: message['description'],
|
description: message['description'] as String,
|
||||||
read: false,
|
read: false,
|
||||||
when: DateTime.parse(message['when']),
|
when: DateTime.parse(message['when'] as String),
|
||||||
sealed: message['sealed']);
|
sealed: message['sealed'] as String);
|
||||||
debugPrint(notif.toString());
|
debugPrint(notif.toString());
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
debugPrint(e.toString());
|
debugPrint(e.toString());
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import 'generated/i18n.dart';
|
||||||
class IntroPage extends AppIntroPage {
|
class IntroPage extends AppIntroPage {
|
||||||
static const String routeName = '/intro';
|
static const String routeName = '/intro';
|
||||||
|
|
||||||
static final fireItems = (context) => <AppIntroItem>[
|
static final fireItems = (BuildContext context) => <AppIntroItem>[
|
||||||
AppIntroItem(
|
AppIntroItem(
|
||||||
icon: Icons.location_on, title: S.of(context).chooseAPlace),
|
icon: Icons.location_on, title: S.of(context).chooseAPlace),
|
||||||
AppIntroItem(
|
AppIntroItem(
|
||||||
|
|
|
||||||
|
|
@ -23,12 +23,12 @@ Future<YourLocation> getUserLocation(
|
||||||
var address;
|
var address;
|
||||||
try {
|
try {
|
||||||
address = await getReverseLocation(lat: yl.lat, lon: yl.lon);
|
address = await getReverseLocation(lat: yl.lat, lon: yl.lon);
|
||||||
yl.description = address;
|
yl.description = address as String;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
try {
|
try {
|
||||||
address =
|
address =
|
||||||
await getReverseLocation(lat: yl.lat, lon: yl.lon, external: true);
|
await getReverseLocation(lat: yl.lat, lon: yl.lon, external: true);
|
||||||
yl.description = address;
|
yl.description = address as String;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print('We cannot reverse geolocate');
|
print('We cannot reverse geolocate');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
lib/main.dart
Normal file
12
lib/main.dart
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
// This file routes to the correct entry point based on flavor
|
||||||
|
// For development flavor, use mainDev.dart
|
||||||
|
// For production flavor, use mainProd.dart
|
||||||
|
|
||||||
|
// This is a workaround for gradle builds that expect lib/main.dart
|
||||||
|
// When building with flutter build command, use -t lib/mainDev.dart or -t lib/mainProd.dart
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
throw Exception(
|
||||||
|
'Please build with: flutter build apk --flavor development -t lib/mainDev.dart\n'
|
||||||
|
'or: flutter build apk --flavor production -t lib/mainProd.dart');
|
||||||
|
}
|
||||||
|
|
@ -42,10 +42,10 @@ Future<void> mainCommon(List<Middleware<AppState>> otherMiddleware) async {
|
||||||
loadSecrets().then((secrets) {
|
loadSecrets().then((secrets) {
|
||||||
final store = Store<AppState>(appStateReducer,
|
final store = Store<AppState>(appStateReducer,
|
||||||
initialState: AppState(
|
initialState: AppState(
|
||||||
gmapKey: secrets['gmapKey'],
|
gmapKey: secrets['gmapKey'] as String,
|
||||||
firesApiKey: secrets['firesApiKey'],
|
firesApiKey: secrets['firesApiKey'] as String,
|
||||||
serverUrl: secrets['firesApiUrl'],
|
serverUrl: secrets['firesApiUrl'] as String,
|
||||||
firesApiUrl: secrets['firesApiUrl'] + "api/v1/"),
|
firesApiUrl: (secrets['firesApiUrl'] as String) + "api/v1/"),
|
||||||
middleware: List.from(otherMiddleware)..add(fetchDataMiddleware));
|
middleware: List.from(otherMiddleware)..add(fetchDataMiddleware));
|
||||||
|
|
||||||
getIt.registerSingleton<Store<AppState>>(store);
|
getIt.registerSingleton<Store<AppState>>(store);
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ class _ViewModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
class MainDrawer extends Drawer {
|
class MainDrawer extends Drawer {
|
||||||
MainDrawer(BuildContext context, String currentRoute, {key})
|
MainDrawer(BuildContext context, String currentRoute, {Key? key})
|
||||||
: super(key: key, child: mainDrawer(context, currentRoute));
|
: super(key: key, child: mainDrawer(context, currentRoute));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ Future<void> main() async {
|
||||||
|
|
||||||
await SentryFlutter.init(
|
await SentryFlutter.init(
|
||||||
(options) {
|
(options) {
|
||||||
options.dsn = secrets['sentryDSN'];
|
options.dsn = secrets['sentryDSN'] as String?;
|
||||||
},
|
},
|
||||||
appRunner: () => mainCommon([]),
|
appRunner: () => mainCommon([]),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -6,27 +6,31 @@ part of 'appState.dart';
|
||||||
// JsonSerializableGenerator
|
// JsonSerializableGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
AppState _$AppStateFromJson(Map json) {
|
AppState _$AppStateFromJson(Map json) => $checkedCreate(
|
||||||
return $checkedNew('AppState', json, () {
|
'AppState',
|
||||||
final val = AppState(
|
json,
|
||||||
yourLocations: $checkedConvert(
|
($checkedConvert) {
|
||||||
json,
|
final val = AppState(
|
||||||
'yourLocations',
|
yourLocations: $checkedConvert(
|
||||||
(v) => (v as List)
|
'yourLocations',
|
||||||
.map((e) =>
|
(v) =>
|
||||||
YourLocation.fromJson(Map<String, dynamic>.from(e as Map)))
|
(v as List<dynamic>?)
|
||||||
.toList()),
|
?.map((e) => YourLocation.fromJson(
|
||||||
fireNotifications: $checkedConvert(
|
Map<String, dynamic>.from(e as Map)))
|
||||||
json,
|
.toList() ??
|
||||||
'fireNotifications',
|
const <YourLocation>[]),
|
||||||
(v) => (v as List)
|
fireNotifications: $checkedConvert(
|
||||||
.map((e) => FireNotification.fromJson(
|
'fireNotifications',
|
||||||
Map<String, dynamic>.from(e as Map)))
|
(v) =>
|
||||||
.toList()),
|
(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>{
|
Map<String, dynamic> _$AppStateToJson(AppState instance) => <String, dynamic>{
|
||||||
'yourLocations': instance.yourLocations.map((e) => e.toJson()).toList(),
|
'yourLocations': instance.yourLocations.map((e) => e.toJson()).toList(),
|
||||||
|
|
|
||||||
|
|
@ -21,9 +21,9 @@ class BasicLocation implements Comparable<BasicLocation> {
|
||||||
}
|
}
|
||||||
|
|
||||||
BasicLocation.fromJson(Map<String, dynamic> json)
|
BasicLocation.fromJson(Map<String, dynamic> json)
|
||||||
: lat = json['lat'],
|
: lat = (json['lat'] as num).toDouble(),
|
||||||
lon = json['lon'],
|
lon = (json['lon'] as num).toDouble(),
|
||||||
description = json['description'];
|
description = json['description'] as String?;
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
'lat': lat,
|
'lat': lat,
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,14 @@ class FireNotification {
|
||||||
required this.subsId}) {}
|
required this.subsId}) {}
|
||||||
|
|
||||||
FireNotification copyWith(
|
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(
|
return new FireNotification(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
lat: lat ?? this.lat,
|
lat: lat ?? this.lat,
|
||||||
|
|
|
||||||
|
|
@ -6,22 +6,24 @@ part of 'fireNotification.dart';
|
||||||
// JsonSerializableGenerator
|
// JsonSerializableGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
FireNotification _$FireNotificationFromJson(Map json) {
|
FireNotification _$FireNotificationFromJson(Map json) => $checkedCreate(
|
||||||
return $checkedNew('FireNotification', json, () {
|
'FireNotification',
|
||||||
final val = FireNotification(
|
json,
|
||||||
id: $checkedConvert(json, 'id', (v) => objectIdFromJson(v as String)),
|
($checkedConvert) {
|
||||||
lat: $checkedConvert(json, 'lat', (v) => (v as num).toDouble()),
|
final val = FireNotification(
|
||||||
lon: $checkedConvert(json, 'lon', (v) => (v as num).toDouble()),
|
id: $checkedConvert('id', (v) => objectIdFromJson(v as String)),
|
||||||
description: $checkedConvert(json, 'description', (v) => v as String),
|
lat: $checkedConvert('lat', (v) => (v as num).toDouble()),
|
||||||
when: $checkedConvert(json, 'when', (v) => DateTime.parse(v as String)),
|
lon: $checkedConvert('lon', (v) => (v as num).toDouble()),
|
||||||
read: $checkedConvert(json, 'read', (v) => v as bool),
|
description: $checkedConvert('description', (v) => v as String),
|
||||||
sealed: $checkedConvert(json, 'sealed', (v) => v as String),
|
when: $checkedConvert('when', (v) => DateTime.parse(v as String)),
|
||||||
subsId:
|
read: $checkedConvert('read', (v) => v as bool),
|
||||||
$checkedConvert(json, 'subsId', (v) => objectIdFromJson(v as String)),
|
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) =>
|
Map<String, dynamic> _$FireNotificationToJson(FireNotification instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,9 @@ Future<List<FireNotification>> loadFireNotifications() async {
|
||||||
List<String>? FireNotifications = prefs.getStringList(fireNotificationKey);
|
List<String>? FireNotifications = prefs.getStringList(fireNotificationKey);
|
||||||
List<FireNotification> persistedList = [];
|
List<FireNotification> persistedList = [];
|
||||||
(FireNotifications ?? []).forEach((notificationString) {
|
(FireNotifications ?? []).forEach((notificationString) {
|
||||||
Map notificationMap = json.decode(notificationString);
|
Map<String, dynamic> notificationMap =
|
||||||
persistedList.add(
|
json.decode(notificationString) as Map<String, dynamic>;
|
||||||
FireNotification.fromJson(notificationMap as Map<String, dynamic>));
|
persistedList.add(FireNotification.fromJson(notificationMap));
|
||||||
});
|
});
|
||||||
return persistedList;
|
return persistedList;
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ class FiresApi {
|
||||||
|
|
||||||
Future<String> createUser(
|
Future<String> createUser(
|
||||||
AppState state, String mobileToken, String lang) async {
|
AppState state, String mobileToken, String lang) async {
|
||||||
|
|
||||||
final params = {
|
final params = {
|
||||||
"token": state.firesApiKey,
|
"token": state.firesApiKey,
|
||||||
"mobileToken": mobileToken,
|
"mobileToken": mobileToken,
|
||||||
|
|
@ -32,7 +31,7 @@ class FiresApi {
|
||||||
try {
|
try {
|
||||||
final response = await _dio.post(url, data: params);
|
final response = await _dio.post(url, data: params);
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
return response.data['data']['userId'];
|
return response.data['data']['userId'] as String;
|
||||||
} else {
|
} else {
|
||||||
throw "Unexpected error on create user";
|
throw "Unexpected error on create user";
|
||||||
}
|
}
|
||||||
|
|
@ -49,18 +48,19 @@ class FiresApi {
|
||||||
try {
|
try {
|
||||||
final response = await _dio.get(url);
|
final response = await _dio.get(url);
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
final dataSubscriptions = response.data['data']['subscriptions'];
|
final dataSubscriptions =
|
||||||
|
response.data['data']['subscriptions'] as List<dynamic>;
|
||||||
List<YourLocation> subscribed = [];
|
List<YourLocation> subscribed = [];
|
||||||
for (int i = 0; i < dataSubscriptions.length; i++) {
|
for (int i = 0; i < dataSubscriptions.length; i++) {
|
||||||
var el = dataSubscriptions[i];
|
var el = dataSubscriptions[i] as Map<String, dynamic>;
|
||||||
var lat = el['location']['lat'];
|
var lat = (el['location']['lat'] as num).toDouble();
|
||||||
var lon = el['location']['lon'];
|
var lon = (el['location']['lon'] as num).toDouble();
|
||||||
subscribed.add(YourLocation(
|
subscribed.add(YourLocation(
|
||||||
id: objectIdFromJson(el['_id']['_str']),
|
id: objectIdFromJson(el['_id']['_str'] as String),
|
||||||
lat: lat,
|
lat: lat,
|
||||||
lon: lon,
|
lon: lon,
|
||||||
subscribed: true,
|
subscribed: true,
|
||||||
distance: el['distance']));
|
distance: (el['distance'] as num).toInt()));
|
||||||
}
|
}
|
||||||
return subscribed;
|
return subscribed;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -84,7 +84,7 @@ class FiresApi {
|
||||||
try {
|
try {
|
||||||
final response = await _dio.post(url, data: params);
|
final response = await _dio.post(url, data: params);
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
return response.data['data']['subsId'];
|
return response.data['data']['subsId'] as String;
|
||||||
} else {
|
} else {
|
||||||
print(response.data);
|
print(response.data);
|
||||||
throw "Unexpected error on subscribe";
|
throw "Unexpected error on subscribe";
|
||||||
|
|
@ -123,10 +123,10 @@ class FiresApi {
|
||||||
final response = await _dio.get(url);
|
final response = await _dio.get(url);
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
var resultDecoded = response.data;
|
var resultDecoded = response.data;
|
||||||
int numFires = resultDecoded['real'];
|
int numFires = (resultDecoded['real'] as num).toInt();
|
||||||
List fires = resultDecoded['fires'];
|
List<dynamic> fires = resultDecoded['fires'] as List<dynamic>;
|
||||||
List falsePos = resultDecoded['falsePos'];
|
List<dynamic> falsePos = resultDecoded['falsePos'] as List<dynamic>;
|
||||||
List industries = resultDecoded['industries'];
|
List<dynamic> industries = resultDecoded['industries'] as List<dynamic>;
|
||||||
|
|
||||||
if (globals.isDevelopment) {
|
if (globals.isDevelopment) {
|
||||||
var firesCount = fires.length;
|
var firesCount = fires.length;
|
||||||
|
|
@ -157,13 +157,18 @@ class FiresApi {
|
||||||
var resultDecoded = response.data;
|
var resultDecoded = response.data;
|
||||||
List<Polyline> union = [];
|
List<Polyline> union = [];
|
||||||
final multipolygon =
|
final multipolygon =
|
||||||
json.decode(resultDecoded['data']['union']['value'])['geometry']
|
(json.decode(resultDecoded['data']['union']['value'] as String)
|
||||||
['coordinates'];
|
as Map<String, dynamic>)['geometry']['coordinates']
|
||||||
for (List<dynamic> polygon in multipolygon) {
|
as List<dynamic>;
|
||||||
for (List<dynamic> hole in polygon) {
|
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 = [];
|
List<LatLng> points = [];
|
||||||
for (List<dynamic> point in hole) {
|
for (dynamic pointDynamic in hole) {
|
||||||
points.add(LatLng(point[1].toDouble(), point[0].toDouble()));
|
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));
|
union.add(Polyline(points: points, color: color, strokeWidth: 3.0));
|
||||||
}
|
}
|
||||||
|
|
@ -178,7 +183,6 @@ class FiresApi {
|
||||||
|
|
||||||
Future<bool> markFalsePositive(AppState state, String mobileToken,
|
Future<bool> markFalsePositive(AppState state, String mobileToken,
|
||||||
String sealed, FalsePositiveType type) async {
|
String sealed, FalsePositiveType type) async {
|
||||||
|
|
||||||
final params = {
|
final params = {
|
||||||
"token": state.firesApiKey,
|
"token": state.firesApiKey,
|
||||||
"mobileToken": mobileToken,
|
"mobileToken": mobileToken,
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,13 @@ class YourLocation {
|
||||||
Map<String, dynamic> toJson() => _$YourLocationToJson(this);
|
Map<String, dynamic> toJson() => _$YourLocationToJson(this);
|
||||||
|
|
||||||
YourLocation copyWith(
|
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(
|
return new YourLocation(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
lat: lat ?? this.lat,
|
lat: lat ?? this.lat,
|
||||||
|
|
|
||||||
|
|
@ -6,21 +6,25 @@ part of 'yourLocation.dart';
|
||||||
// JsonSerializableGenerator
|
// JsonSerializableGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
YourLocation _$YourLocationFromJson(Map json) {
|
YourLocation _$YourLocationFromJson(Map json) => $checkedCreate(
|
||||||
return $checkedNew('YourLocation', json, () {
|
'YourLocation',
|
||||||
final val = YourLocation(
|
json,
|
||||||
id: $checkedConvert(json, 'id', (v) => objectIdFromJson(v as String)),
|
($checkedConvert) {
|
||||||
lat: $checkedConvert(json, 'lat', (v) => (v as num).toDouble()),
|
final val = YourLocation(
|
||||||
lon: $checkedConvert(json, 'lon', (v) => (v as num).toDouble()),
|
id: $checkedConvert('id', (v) => objectIdFromJson(v as String)),
|
||||||
description: $checkedConvert(json, 'description', (v) => v as String),
|
lat: $checkedConvert('lat', (v) => (v as num).toDouble()),
|
||||||
distance: $checkedConvert(json, 'distance', (v) => v as int),
|
lon: $checkedConvert('lon', (v) => (v as num).toDouble()),
|
||||||
currentNumFires:
|
description:
|
||||||
$checkedConvert(json, 'currentNumFires', (v) => v as int),
|
$checkedConvert('description', (v) => v as String? ?? ''),
|
||||||
subscribed: $checkedConvert(json, 'subscribed', (v) => v as bool),
|
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) =>
|
Map<String, dynamic> _$YourLocationToJson(YourLocation instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,9 @@ Future<List<YourLocation>> loadYourLocations() async {
|
||||||
List<String>? yourLocations = prefs.getStringList(locationKey);
|
List<String>? yourLocations = prefs.getStringList(locationKey);
|
||||||
List<YourLocation> persistedList = [];
|
List<YourLocation> persistedList = [];
|
||||||
(yourLocations ?? []).forEach((locationString) {
|
(yourLocations ?? []).forEach((locationString) {
|
||||||
Map locationMap = json.decode(locationString);
|
Map<String, dynamic> locationMap =
|
||||||
persistedList
|
json.decode(locationString) as Map<String, dynamic>;
|
||||||
.add(YourLocation.fromJson(locationMap as Map<String, dynamic>));
|
persistedList.add(YourLocation.fromJson(locationMap));
|
||||||
});
|
});
|
||||||
return persistedList;
|
return persistedList;
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import 'package:objectid/objectid.dart';
|
import 'package:objectid/objectid.dart';
|
||||||
|
|
||||||
objectIdFromJson(String json) {
|
ObjectId objectIdFromJson(String json) {
|
||||||
return new ObjectId.fromHexString(
|
return new ObjectId.fromHexString(
|
||||||
json.replaceFirst("ObjectId(", "").replaceAll(")", ""));
|
json.replaceFirst("ObjectId(", "").replaceAll(")", ""));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import 'markdownPage.dart';
|
||||||
class PrivacyPage extends MarkdownPage {
|
class PrivacyPage extends MarkdownPage {
|
||||||
static const String routeName = '/privacy';
|
static const String routeName = '/privacy';
|
||||||
|
|
||||||
PrivacyPage(context)
|
PrivacyPage(BuildContext context)
|
||||||
: super(
|
: super(
|
||||||
title: S.of(context).privacyPolicy,
|
title: S.of(context).privacyPolicy,
|
||||||
route: routeName,
|
route: routeName,
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,7 @@ void fetchDataMiddleware(Store<AppState> store, action, NextDispatcher next) {
|
||||||
final Completer<Null>? completer = action.refreshCallback;
|
final Completer<Null>? completer = action.refreshCallback;
|
||||||
completer?.complete(null);
|
completer?.complete(null);
|
||||||
});
|
});
|
||||||
}).catchError((onError) {
|
}).catchError((Exception onError) {
|
||||||
// If it fails, dispatch a failure action. The reducer will
|
// If it fails, dispatch a failure action. The reducer will
|
||||||
// update the state with the error.
|
// update the state with the error.
|
||||||
store.dispatch(new FetchYourLocationsFailedAction(onError));
|
store.dispatch(new FetchYourLocationsFailedAction(onError));
|
||||||
|
|
@ -261,7 +261,8 @@ void unsubsViaApi(Store<AppState> store, ObjectId id, onUnsubs) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void subscribeViaApi(Store<AppState> store, YourLocation loc, onSubs) {
|
void subscribeViaApi(
|
||||||
|
Store<AppState> store, YourLocation loc, Function(YourLocation) onSubs) {
|
||||||
api.subscribe(store.state, loc).then((subsId) {
|
api.subscribe(store.state, loc).then((subsId) {
|
||||||
YourLocation sub = loc;
|
YourLocation sub = loc;
|
||||||
// if (loc.id != subsId) {
|
// if (loc.id != subsId) {
|
||||||
|
|
@ -272,7 +273,7 @@ void subscribeViaApi(Store<AppState> store, YourLocation loc, onSubs) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void createUser(store, lang, token) {
|
void createUser(Store<AppState> store, String lang, String token) {
|
||||||
assert(token != null, "User lang is null");
|
assert(token != null, "User lang is null");
|
||||||
assert(token != null, "User mobile token is null");
|
assert(token != null, "User mobile token is null");
|
||||||
api.createUser(store.state, token, lang).then((userId) {
|
api.createUser(store.state, token, lang).then((userId) {
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,7 @@ FireMapState _editCancelYourLocationMap(
|
||||||
status: restoreStatusAfterSave(action.loc), yourLocation: action.loc);
|
status: restoreStatusAfterSave(action.loc), yourLocation: action.loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
FireMapStatus restoreStatusAfterSave(loc) =>
|
FireMapStatus restoreStatusAfterSave(YourLocation loc) =>
|
||||||
loc.subscribed ? FireMapStatus.unsubscribe : FireMapStatus.view;
|
loc.subscribed ? FireMapStatus.unsubscribe : FireMapStatus.view;
|
||||||
|
|
||||||
FireMapState _selectMapLayer(FireMapState state, SelectMapLayerAction action) {
|
FireMapState _selectMapLayer(FireMapState state, SelectMapLayerAction action) {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import 'actions.dart';
|
import 'actions.dart';
|
||||||
|
|
||||||
bool loadedReducer(isLoaded, action) {
|
bool loadedReducer(bool isLoaded, dynamic action) {
|
||||||
if (action is FetchYourLocationsSucceededAction) return true;
|
if (action is FetchYourLocationsSucceededAction) return true;
|
||||||
return isLoaded;
|
return isLoaded;
|
||||||
}
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import 'actions.dart';
|
import 'actions.dart';
|
||||||
bool loadingReducer(isLoading, action) {
|
|
||||||
|
bool loadingReducer(bool isLoading, dynamic action) {
|
||||||
if (action is FetchYourLocationsAction) return true;
|
if (action is FetchYourLocationsAction) return true;
|
||||||
return isLoading;
|
return isLoading;
|
||||||
}
|
}
|
||||||
|
|
@ -25,11 +25,11 @@ class _FireDistanceSliderState extends State<FireDistanceSlider> {
|
||||||
this._sliderValue = initialValue;
|
this._sliderValue = initialValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
sizeText(sliderValue) => new Text(
|
Widget sizeText(int sliderValue) => new Text(
|
||||||
S.of(context).subscribeToValueAroundThisArea(sliderValue.toString()),
|
S.of(context).subscribeToValueAroundThisArea(sliderValue.toString()),
|
||||||
style: new TextStyle(color: Colors.black87));
|
style: new TextStyle(color: Colors.black87));
|
||||||
|
|
||||||
warningText(sliderValue) => _sliderValue >= 50
|
Widget warningText(int sliderValue) => _sliderValue >= 50
|
||||||
? new Text(S.of(context).warningThisIsAVeryLargeArea,
|
? new Text(S.of(context).warningThisIsAVeryLargeArea,
|
||||||
style: new TextStyle(color: fires900))
|
style: new TextStyle(color: fires900))
|
||||||
: new Text('');
|
: new Text('');
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue