diff --git a/lib/globalFiresBottomStats.dart b/lib/globalFiresBottomStats.dart index d96777d..8e07d7e 100644 --- a/lib/globalFiresBottomStats.dart +++ b/lib/globalFiresBottomStats.dart @@ -25,12 +25,12 @@ class _GlobalFiresBottomStatsState extends State { http.read(Uri.parse('${firesApiUrl}status/last-fire-check')).then((result) { try { var now = Moment.now(); - var last = DateTime.parse(json.decode(result)['value']); + var last = DateTime.parse(json.decode(result)['value'] as String); http .read(Uri.parse('${firesApiUrl}status/active-fires-count')) .then((result) { try { - int count = json.decode(result)['total']; + int count = (json.decode(result)['total'] as num).toInt(); setState(() { lastCheck = now.from(context, last); activeFires = count; diff --git a/lib/homePage.dart b/lib/homePage.dart index e5f9d1d..b5cbc00 100644 --- a/lib/homePage.dart +++ b/lib/homePage.dart @@ -72,8 +72,7 @@ class _HomePageState extends State { debugPrint( "onMessage in fireApp (isLoaded: ${store.state.isLoaded}): $message"); if (message.data.isNotEmpty) { - final notif = _notifForMessage( - message.data, store.state.isLoaded); + final notif = _notifForMessage(message.data, store.state.isLoaded); if (notif != null) { _showItemDialog(message.data, notif); } @@ -85,8 +84,7 @@ class _HomePageState extends State { debugPrint( "onMessageOpenedApp (isLoaded: ${store.state.isLoaded}): $message"); if (message.data.isNotEmpty) { - _notifForMessage( - message.data, store.state.isLoaded); + _notifForMessage(message.data, store.state.isLoaded); _navigateToItemDetail(message.data); } }); @@ -283,14 +281,14 @@ class _HomePageState extends State { FireNotification? notif; try { notif = new FireNotification( - id: objectIdFromJson(message['id']), - subsId: objectIdFromJson(message['subsId']), - lat: double.parse(message['lat']), - lon: double.parse(message['lon']), - description: message['description'], + id: objectIdFromJson(message['id'] as String), + subsId: objectIdFromJson(message['subsId'] as String), + lat: double.parse(message['lat'] as String), + lon: double.parse(message['lon'] as String), + description: message['description'] as String, read: false, - when: DateTime.parse(message['when']), - sealed: message['sealed']); + when: DateTime.parse(message['when'] as String), + sealed: message['sealed'] as String); debugPrint(notif.toString()); } catch (e) { debugPrint(e.toString()); diff --git a/lib/introPage.dart b/lib/introPage.dart index 24163dc..76b03de 100644 --- a/lib/introPage.dart +++ b/lib/introPage.dart @@ -7,7 +7,7 @@ import 'generated/i18n.dart'; class IntroPage extends AppIntroPage { static const String routeName = '/intro'; - static final fireItems = (context) => [ + static final fireItems = (BuildContext context) => [ AppIntroItem( icon: Icons.location_on, title: S.of(context).chooseAPlace), AppIntroItem( diff --git a/lib/locationUtils.dart b/lib/locationUtils.dart index 58e169c..d5503e9 100644 --- a/lib/locationUtils.dart +++ b/lib/locationUtils.dart @@ -23,12 +23,12 @@ Future getUserLocation( var address; try { address = await getReverseLocation(lat: yl.lat, lon: yl.lon); - yl.description = address; + yl.description = address as String; } catch (e) { try { address = await getReverseLocation(lat: yl.lat, lon: yl.lon, external: true); - yl.description = address; + yl.description = address as String; } catch (e) { print('We cannot reverse geolocate'); } diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..b78b774 --- /dev/null +++ b/lib/main.dart @@ -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'); +} diff --git a/lib/mainCommon.dart b/lib/mainCommon.dart index 51d178b..75d420d 100644 --- a/lib/mainCommon.dart +++ b/lib/mainCommon.dart @@ -42,10 +42,10 @@ Future mainCommon(List> otherMiddleware) async { loadSecrets().then((secrets) { final store = Store(appStateReducer, initialState: AppState( - gmapKey: secrets['gmapKey'], - firesApiKey: secrets['firesApiKey'], - serverUrl: secrets['firesApiUrl'], - firesApiUrl: secrets['firesApiUrl'] + "api/v1/"), + gmapKey: secrets['gmapKey'] as String, + firesApiKey: secrets['firesApiKey'] as String, + serverUrl: secrets['firesApiUrl'] as String, + firesApiUrl: (secrets['firesApiUrl'] as String) + "api/v1/"), middleware: List.from(otherMiddleware)..add(fetchDataMiddleware)); getIt.registerSingleton>(store); diff --git a/lib/mainDrawer.dart b/lib/mainDrawer.dart index 974716f..6f75716 100644 --- a/lib/mainDrawer.dart +++ b/lib/mainDrawer.dart @@ -36,7 +36,7 @@ class _ViewModel { } class MainDrawer extends Drawer { - MainDrawer(BuildContext context, String currentRoute, {key}) + MainDrawer(BuildContext context, String currentRoute, {Key? key}) : super(key: key, child: mainDrawer(context, currentRoute)); } diff --git a/lib/mainProd.dart b/lib/mainProd.dart index 9aad123..9cec661 100644 --- a/lib/mainProd.dart +++ b/lib/mainProd.dart @@ -12,7 +12,7 @@ Future main() async { await SentryFlutter.init( (options) { - options.dsn = secrets['sentryDSN']; + options.dsn = secrets['sentryDSN'] as String?; }, appRunner: () => mainCommon([]), ); diff --git a/lib/models/appState.g.dart b/lib/models/appState.g.dart index 4a42177..63c301e 100644 --- a/lib/models/appState.g.dart +++ b/lib/models/appState.g.dart @@ -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.from(e as Map))) - .toList()), - fireNotifications: $checkedConvert( - json, - 'fireNotifications', - (v) => (v as List) - .map((e) => FireNotification.fromJson( - Map.from(e as Map))) - .toList()), +AppState _$AppStateFromJson(Map json) => $checkedCreate( + 'AppState', + json, + ($checkedConvert) { + final val = AppState( + yourLocations: $checkedConvert( + 'yourLocations', + (v) => + (v as List?) + ?.map((e) => YourLocation.fromJson( + Map.from(e as Map))) + .toList() ?? + const []), + fireNotifications: $checkedConvert( + 'fireNotifications', + (v) => + (v as List?) + ?.map((e) => FireNotification.fromJson( + Map.from(e as Map))) + .toList() ?? + const []), + ); + return val; + }, ); - return val; - }); -} Map _$AppStateToJson(AppState instance) => { 'yourLocations': instance.yourLocations.map((e) => e.toJson()).toList(), diff --git a/lib/models/basicLocation.dart b/lib/models/basicLocation.dart index 684120d..1b89a33 100644 --- a/lib/models/basicLocation.dart +++ b/lib/models/basicLocation.dart @@ -21,9 +21,9 @@ class BasicLocation implements Comparable { } BasicLocation.fromJson(Map 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 toJson() => { 'lat': lat, diff --git a/lib/models/fireNotification.dart b/lib/models/fireNotification.dart index fa5d9be..b6522ac 100644 --- a/lib/models/fireNotification.dart +++ b/lib/models/fireNotification.dart @@ -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, diff --git a/lib/models/fireNotification.g.dart b/lib/models/fireNotification.g.dart index b29fc1f..3491be7 100644 --- a/lib/models/fireNotification.g.dart +++ b/lib/models/fireNotification.g.dart @@ -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 _$FireNotificationToJson(FireNotification instance) => { diff --git a/lib/models/fireNotificationsPersist.dart b/lib/models/fireNotificationsPersist.dart index 6cb2f4a..ff455fc 100644 --- a/lib/models/fireNotificationsPersist.dart +++ b/lib/models/fireNotificationsPersist.dart @@ -13,9 +13,9 @@ Future> loadFireNotifications() async { List? FireNotifications = prefs.getStringList(fireNotificationKey); List persistedList = []; (FireNotifications ?? []).forEach((notificationString) { - Map notificationMap = json.decode(notificationString); - persistedList.add( - FireNotification.fromJson(notificationMap as Map)); + Map notificationMap = + json.decode(notificationString) as Map; + persistedList.add(FireNotification.fromJson(notificationMap)); }); return persistedList; }); diff --git a/lib/models/firesApi.dart b/lib/models/firesApi.dart index 5dce892..be25c68 100644 --- a/lib/models/firesApi.dart +++ b/lib/models/firesApi.dart @@ -22,7 +22,6 @@ class FiresApi { Future 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; List 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; + 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 fires = resultDecoded['fires'] as List; + List falsePos = resultDecoded['falsePos'] as List; + List industries = resultDecoded['industries'] as List; if (globals.isDevelopment) { var firesCount = fires.length; @@ -157,13 +157,18 @@ class FiresApi { var resultDecoded = response.data; List union = []; final multipolygon = - json.decode(resultDecoded['data']['union']['value'])['geometry'] - ['coordinates']; - for (List polygon in multipolygon) { - for (List hole in polygon) { + (json.decode(resultDecoded['data']['union']['value'] as String) + as Map)['geometry']['coordinates'] + as List; + for (dynamic polygonDynamic in multipolygon) { + var polygon = polygonDynamic as List; + for (dynamic holeDynamic in polygon) { + var hole = holeDynamic as List; List points = []; - for (List point in hole) { - points.add(LatLng(point[1].toDouble(), point[0].toDouble())); + for (dynamic pointDynamic in hole) { + var point = pointDynamic as List; + 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 markFalsePositive(AppState state, String mobileToken, String sealed, FalsePositiveType type) async { - final params = { "token": state.firesApiKey, "mobileToken": mobileToken, diff --git a/lib/models/yourLocation.dart b/lib/models/yourLocation.dart index d4295f5..ff18561 100644 --- a/lib/models/yourLocation.dart +++ b/lib/models/yourLocation.dart @@ -39,7 +39,13 @@ class YourLocation { Map 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, diff --git a/lib/models/yourLocation.g.dart b/lib/models/yourLocation.g.dart index 4261219..db3acc2 100644 --- a/lib/models/yourLocation.g.dart +++ b/lib/models/yourLocation.g.dart @@ -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 _$YourLocationToJson(YourLocation instance) => { diff --git a/lib/models/yourLocationPersist.dart b/lib/models/yourLocationPersist.dart index 3508b25..4ae923f 100644 --- a/lib/models/yourLocationPersist.dart +++ b/lib/models/yourLocationPersist.dart @@ -13,9 +13,9 @@ Future> loadYourLocations() async { List? yourLocations = prefs.getStringList(locationKey); List persistedList = []; (yourLocations ?? []).forEach((locationString) { - Map locationMap = json.decode(locationString); - persistedList - .add(YourLocation.fromJson(locationMap as Map)); + Map locationMap = + json.decode(locationString) as Map; + persistedList.add(YourLocation.fromJson(locationMap)); }); return persistedList; }); diff --git a/lib/objectIdUtils.dart b/lib/objectIdUtils.dart index 8e80b6e..c574356 100644 --- a/lib/objectIdUtils.dart +++ b/lib/objectIdUtils.dart @@ -1,6 +1,6 @@ import 'package:objectid/objectid.dart'; -objectIdFromJson(String json) { +ObjectId objectIdFromJson(String json) { return new ObjectId.fromHexString( json.replaceFirst("ObjectId(", "").replaceAll(")", "")); } diff --git a/lib/privacyPage.dart b/lib/privacyPage.dart index e77b47a..acc9501 100644 --- a/lib/privacyPage.dart +++ b/lib/privacyPage.dart @@ -7,7 +7,7 @@ import 'markdownPage.dart'; class PrivacyPage extends MarkdownPage { static const String routeName = '/privacy'; - PrivacyPage(context) + PrivacyPage(BuildContext context) : super( title: S.of(context).privacyPolicy, route: routeName, diff --git a/lib/redux/fetchDataMiddleware.dart b/lib/redux/fetchDataMiddleware.dart index e3af43d..581ea51 100644 --- a/lib/redux/fetchDataMiddleware.dart +++ b/lib/redux/fetchDataMiddleware.dart @@ -185,7 +185,7 @@ void fetchDataMiddleware(Store store, action, NextDispatcher next) { final Completer? completer = action.refreshCallback; completer?.complete(null); }); - }).catchError((onError) { + }).catchError((Exception onError) { // If it fails, dispatch a failure action. The reducer will // update the state with the error. store.dispatch(new FetchYourLocationsFailedAction(onError)); @@ -261,7 +261,8 @@ void unsubsViaApi(Store store, ObjectId id, onUnsubs) { }); } -void subscribeViaApi(Store store, YourLocation loc, onSubs) { +void subscribeViaApi( + Store store, YourLocation loc, Function(YourLocation) onSubs) { api.subscribe(store.state, loc).then((subsId) { YourLocation sub = loc; // if (loc.id != subsId) { @@ -272,7 +273,7 @@ void subscribeViaApi(Store store, YourLocation loc, onSubs) { }); } -void createUser(store, lang, token) { +void createUser(Store store, String lang, String token) { assert(token != null, "User lang is null"); assert(token != null, "User mobile token is null"); api.createUser(store.state, token, lang).then((userId) { diff --git a/lib/redux/fireMapReducer.dart b/lib/redux/fireMapReducer.dart index 32a76ea..0b2590b 100644 --- a/lib/redux/fireMapReducer.dart +++ b/lib/redux/fireMapReducer.dart @@ -96,7 +96,7 @@ FireMapState _editCancelYourLocationMap( status: restoreStatusAfterSave(action.loc), yourLocation: action.loc); } -FireMapStatus restoreStatusAfterSave(loc) => +FireMapStatus restoreStatusAfterSave(YourLocation loc) => loc.subscribed ? FireMapStatus.unsubscribe : FireMapStatus.view; FireMapState _selectMapLayer(FireMapState state, SelectMapLayerAction action) { diff --git a/lib/redux/loadedReducer.dart b/lib/redux/loadedReducer.dart index 96b549a..bc6860a 100644 --- a/lib/redux/loadedReducer.dart +++ b/lib/redux/loadedReducer.dart @@ -1,6 +1,6 @@ import 'actions.dart'; -bool loadedReducer(isLoaded, action) { +bool loadedReducer(bool isLoaded, dynamic action) { if (action is FetchYourLocationsSucceededAction) return true; return isLoaded; -} \ No newline at end of file +} diff --git a/lib/redux/loadingReducer.dart b/lib/redux/loadingReducer.dart index bbb62cc..c52596f 100644 --- a/lib/redux/loadingReducer.dart +++ b/lib/redux/loadingReducer.dart @@ -1,5 +1,6 @@ import 'actions.dart'; -bool loadingReducer(isLoading, action) { + +bool loadingReducer(bool isLoading, dynamic action) { if (action is FetchYourLocationsAction) return true; return isLoading; -} \ No newline at end of file +} diff --git a/lib/slider.dart b/lib/slider.dart index cf3f248..bbac840 100644 --- a/lib/slider.dart +++ b/lib/slider.dart @@ -25,11 +25,11 @@ class _FireDistanceSliderState extends State { this._sliderValue = initialValue; } - sizeText(sliderValue) => new Text( + Widget sizeText(int sliderValue) => new Text( S.of(context).subscribeToValueAroundThisArea(sliderValue.toString()), style: new TextStyle(color: Colors.black87)); - warningText(sliderValue) => _sliderValue >= 50 + Widget warningText(int sliderValue) => _sliderValue >= 50 ? new Text(S.of(context).warningThisIsAVeryLargeArea, style: new TextStyle(color: fires900)) : new Text('');