diff --git a/lib/activeFires.dart b/lib/activeFires.dart index e1b0822..5f7de45 100644 --- a/lib/activeFires.dart +++ b/lib/activeFires.dart @@ -287,7 +287,7 @@ class _ActiveFiresPageState extends State { Navigator.push( context, MaterialPageRoute( - builder: (BuildContext context) => const genericMap())); + builder: (BuildContext context) => const GenericMap())); } void onAddYourLocation(AddYourLocationFunction onAdd) { diff --git a/lib/fireMarkType.dart b/lib/fireMarkType.dart index ba953bc..bff5386 100644 --- a/lib/fireMarkType.dart +++ b/lib/fireMarkType.dart @@ -4,4 +4,4 @@ enum FireMarkType { fire, industry, falsePos -} \ No newline at end of file +} diff --git a/lib/fireNotificationList.dart b/lib/fireNotificationList.dart index 4041f2f..7112e3e 100644 --- a/lib/fireNotificationList.dart +++ b/lib/fireNotificationList.dart @@ -238,7 +238,7 @@ class _FireNotificationListState extends State { Navigator.push( context, MaterialPageRoute( - builder: (BuildContext context) => const genericMap())); + builder: (BuildContext context) => const GenericMap())); } Future _showConfirmDialog(_ViewModel view) { diff --git a/lib/genericMap.dart b/lib/genericMap.dart index 42a8de0..facbc2b 100644 --- a/lib/genericMap.dart +++ b/lib/genericMap.dart @@ -72,14 +72,14 @@ class _ViewModel { int get hashCode => serverUrl.hashCode ^ lang.hashCode ^ mapState.hashCode; } -class genericMap extends StatefulWidget { - const genericMap({super.key}); +class GenericMap extends StatefulWidget { + const GenericMap({super.key}); @override - _genericMapState createState() => _genericMapState(); + GenericMapState createState() => GenericMapState(); } -class _genericMapState extends State { +class GenericMapState extends State { // This needs to be stateful so when resizes don't get a new globalkey // https://github.com/flutter/flutter/issues/1632#issuecomment-180478202 final GlobalKey _scaffoldKey = GlobalKey(); diff --git a/lib/homePage.dart b/lib/homePage.dart index 93465ce..0c4d165 100644 --- a/lib/homePage.dart +++ b/lib/homePage.dart @@ -5,6 +5,7 @@ import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:get_it/get_it.dart'; +import 'package:meta/meta.dart'; import 'package:redux/redux.dart'; import 'activeFires.dart'; @@ -19,6 +20,7 @@ import 'models/fireNotification.dart'; import 'objectIdUtils.dart'; import 'redux/actions.dart'; +@immutable class _ViewModel { _ViewModel({required this.isLoaded}); final bool isLoaded; @@ -217,8 +219,7 @@ class _HomePageState extends State { if (shouldNavigate ?? false) { _navigateToItemDetail(message); } - }).catchError((Object e) { - }); + }).catchError((Object e) {}); } Widget _buildDialog(BuildContext context, FireNotification item) { diff --git a/lib/introPage.dart b/lib/introPage.dart index ca6d253..31df206 100644 --- a/lib/introPage.dart +++ b/lib/introPage.dart @@ -10,9 +10,9 @@ class IntroPage extends AppIntroPage { items: _fireItems, onIntroFinish: (BuildContext context) => Navigator.pushNamed(context, HomePage.routeName)); - static const String routeName = '/intro'; + static String routeName = '/intro'; - static final _fireItems = (BuildContext context) => [ + static List _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 566e3f5..a402706 100644 --- a/lib/locationUtils.dart +++ b/lib/locationUtils.dart @@ -37,15 +37,19 @@ Future getUserLocation( } on PlatformException catch (e) { final BuildContext? context = scaffoldKey.currentContext; if (context != null) { + // ignore: use_build_context_synchronously + final S strings = S.of(context); + // ignore: use_build_context_synchronously + final ScaffoldMessengerState messenger = ScaffoldMessenger.of(context); if (e.code == 'PERMISSION_DENIED') { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(S.of(context).notPermsUbication), + messenger.showSnackBar(SnackBar( + content: Text(strings.notPermsUbication), )); } else if (e.code == 'PERMISSION_DENIED_NEVER_ASK') { // User selected "Don't ask again" - show settings prompt } - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(S.of(context).isYourUbicationEnabled), + messenger.showSnackBar(SnackBar( + content: Text(strings.isYourUbicationEnabled), )); } return YourLocation.noLocation; diff --git a/lib/models/basicLocation.dart b/lib/models/basicLocation.dart index 7b56895..9a1c801 100644 --- a/lib/models/basicLocation.dart +++ b/lib/models/basicLocation.dart @@ -1,5 +1,7 @@ -class BasicLocation implements Comparable { +import 'package:meta/meta.dart'; +@immutable +class BasicLocation implements Comparable { // static BasicLocation noLocation = new BasicLocation(lat: 0.0, lon: 0.0); BasicLocation({required this.lat, required this.lon, this.description}); @@ -18,7 +20,8 @@ class BasicLocation implements Comparable { } @override - bool operator ==(Object o) => o is BasicLocation && o.lat == lat && o.lon == lon; + bool operator ==(Object o) => + o is BasicLocation && o.lat == lat && o.lon == lon; @override int get hashCode { diff --git a/lib/models/falsePositiveTypes.dart b/lib/models/falsePositiveTypes.dart index 4895095..3ce2cfd 100644 --- a/lib/models/falsePositiveTypes.dart +++ b/lib/models/falsePositiveTypes.dart @@ -1 +1 @@ -enum FalsePositiveType { industry, controled, falsealarm } \ No newline at end of file +enum FalsePositiveType { industry, controled, falsealarm } diff --git a/lib/models/fireNotification.dart b/lib/models/fireNotification.dart index 7e6e5e1..b2879c9 100644 --- a/lib/models/fireNotification.dart +++ b/lib/models/fireNotification.dart @@ -1,15 +1,16 @@ import 'package:comunes_flutter/comunes_flutter.dart'; import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; +import 'package:meta/meta.dart'; import 'package:objectid/objectid.dart'; import '../objectIdUtils.dart'; part 'fireNotification.g.dart'; -@JsonSerializable(nullable: false) +@immutable +@JsonSerializable() class FireNotification { - FireNotification( {required this.id, required this.lat, diff --git a/lib/models/firesApi.dart b/lib/models/firesApi.dart index 7c6c474..4e43603 100644 --- a/lib/models/firesApi.dart +++ b/lib/models/firesApi.dart @@ -28,9 +28,11 @@ class FiresApi { }; final String url = '${state.firesApiUrl}mobile/users'; try { - final Response response = await _dio.post(url, data: params); + final Response> response = + await _dio.post>(url, data: params); if (response.statusCode == 200) { - return response.data['data']['userId'] as String; + final Map data = response.data as Map; + return data['data']['userId'] as String; } else { throw Exception('Unexpected error on create user'); } @@ -45,18 +47,25 @@ class FiresApi { final String url = '${state.firesApiUrl}mobile/subscriptions/all/$apiKey/$mobileToken'; try { - final Response response = await _dio.get(url); + final Response> response = + await _dio.get>(url); if (response.statusCode == 200) { + final Map data = response.data as Map; + final Map dataData = + data['data'] as Map; final List dataSubscriptions = - response.data['data']['subscriptions'] as List; + dataData['subscriptions'] as List; final List subscribed = []; for (int i = 0; i < dataSubscriptions.length; i++) { final Map el = dataSubscriptions[i] as Map; - final double lat = (el['location']['lat'] as num).toDouble(); - final double lon = (el['location']['lon'] as num).toDouble(); + final Map location = + el['location'] as Map; + final double lat = (location['lat'] as num).toDouble(); + final double lon = (location['lon'] as num).toDouble(); + final Map id = el['_id'] as Map; subscribed.add(YourLocation( - id: objectIdFromJson(el['_id']['_str'] as String), + id: objectIdFromJson(id['_str'] as String), lat: lat, lon: lon, subscribed: true, @@ -82,9 +91,11 @@ class FiresApi { }; final String url = '${state.firesApiUrl}mobile/subscriptions'; try { - final Response response = await _dio.post(url, data: params); + final Response> response = + await _dio.post>(url, data: params); if (response.statusCode == 200) { - return response.data['data']['subsId'] as String; + final Map data = response.data as Map; + return data['data']['subsId'] as String; } else { throw Exception('Unexpected error on subscribe'); } diff --git a/lib/models/yourLocation.dart b/lib/models/yourLocation.dart index 9f8fd99..8c1e044 100644 --- a/lib/models/yourLocation.dart +++ b/lib/models/yourLocation.dart @@ -1,10 +1,12 @@ import 'package:json_annotation/json_annotation.dart'; +import 'package:meta/meta.dart'; import 'package:objectid/objectid.dart'; import '../objectIdUtils.dart'; part 'yourLocation.g.dart'; +@immutable @JsonSerializable() class YourLocation { YourLocation( diff --git a/lib/monitoredAreas.dart b/lib/monitoredAreas.dart index 15120e1..b24099e 100644 --- a/lib/monitoredAreas.dart +++ b/lib/monitoredAreas.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:latlong2/latlong.dart'; +import 'package:meta/meta.dart'; import 'package:redux/src/store.dart'; import 'colors.dart'; @@ -11,8 +12,8 @@ import 'generated/i18n.dart'; import 'mainDrawer.dart'; import 'models/appState.dart'; +@immutable class _ViewModel { - _ViewModel(this.monitoredAreas); List monitoredAreas; @@ -41,8 +42,7 @@ class MonitoredAreasPage extends StatelessWidget { }, builder: (BuildContext context, _ViewModel view) { return Scaffold( - appBar: - AppBar(title: Text(S.of(context).monitoredAreasTitle)), + appBar: AppBar(title: Text(S.of(context).monitoredAreasTitle)), drawer: MainDrawer(context, MonitoredAreasPage.routeName), bottomNavigationBar: CustomBottomAppBar( fabLocation: FloatingActionButtonLocation.centerDocked, @@ -51,7 +51,8 @@ class MonitoredAreasPage extends StatelessWidget { actions: [ Flexible( child: Padding( - padding: const EdgeInsets.only(left: 10.0, right: 10.0), + padding: + const EdgeInsets.only(left: 10.0, right: 10.0), child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -62,37 +63,35 @@ class MonitoredAreasPage extends StatelessWidget { ]))) ]), body: Padding( - padding: const EdgeInsets.all(10.0), - child: Column( + padding: const EdgeInsets.all(10.0), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.only(top: 8.0, bottom: 8.0), + child: Text(S.of(context).inGreenMonitoredAreas), + ), + Flexible( + child: FlutterMap( + options: const MapOptions( + initialCenter: LatLng(53.5775, 3.106111), + initialZoom: 1.0, + ), children: [ - Padding( - padding: const EdgeInsets.only( - top: 8.0, bottom: 8.0), - child: Text(S.of(context).inGreenMonitoredAreas), - ), - Flexible( - child: FlutterMap( - options: const MapOptions( - initialCenter: LatLng(53.5775, 3.106111), - initialZoom: 1.0, - ), - children: [ - TileLayer( - urlTemplate: - 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png', - subdomains: const ['a', 'b', 'c', 'd'], - userAgentPackageName: - 'com.example.fires_flutter'), - const CompassMapPluginWidget(), - PolylineLayer( - polylines: view.monitoredAreas, - ) - ], - ), - ), + TileLayer( + urlTemplate: + 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png', + subdomains: const ['a', 'b', 'c', 'd'], + userAgentPackageName: 'com.example.fires_flutter'), + const CompassMapPluginWidget(), + PolylineLayer( + polylines: view.monitoredAreas, + ) ], ), ), + ], + ), + ), ); }); } diff --git a/lib/placesAutocompleteUtils.dart b/lib/placesAutocompleteUtils.dart index 8ba76cd..aa88c7e 100644 --- a/lib/placesAutocompleteUtils.dart +++ b/lib/placesAutocompleteUtils.dart @@ -31,7 +31,7 @@ class _PlaceSelectionDialog extends StatefulWidget { class _PlaceSelectionDialogState extends State<_PlaceSelectionDialog> { final TextEditingController _searchController = TextEditingController(); - List _searchResults = []; + List _searchResults = []; bool _isSearching = false; String? _errorMessage; @@ -44,7 +44,7 @@ class _PlaceSelectionDialogState extends State<_PlaceSelectionDialog> { Future _searchPlaces(String query) async { if (query.isEmpty) { setState(() { - _searchResults = []; + _searchResults = []; _errorMessage = null; }); return; @@ -66,7 +66,7 @@ class _PlaceSelectionDialogState extends State<_PlaceSelectionDialog> { } catch (e) { setState(() { _errorMessage = 'Search error: ${e.toString()}'; - _searchResults = []; + _searchResults = []; }); } finally { setState(() { @@ -147,7 +147,7 @@ class _PlaceSelectionDialogState extends State<_PlaceSelectionDialog> { _searchPlaces(value); } else { setState(() { - _searchResults = []; + _searchResults = []; _errorMessage = null; }); } diff --git a/lib/redux/actions.dart b/lib/redux/actions.dart index 71165d3..bbecfa4 100644 --- a/lib/redux/actions.dart +++ b/lib/redux/actions.dart @@ -1,4 +1,4 @@ export 'appActions.dart'; export 'fireMapActions.dart'; export 'fireNotificationActions.dart'; -export 'yourLocationActions.dart'; \ No newline at end of file +export 'yourLocationActions.dart'; diff --git a/lib/redux/errorReducer.dart b/lib/redux/errorReducer.dart index a8403cb..64f5216 100644 --- a/lib/redux/errorReducer.dart +++ b/lib/redux/errorReducer.dart @@ -1,3 +1,3 @@ -String errorReducer(String error, action) { +String errorReducer(String error, dynamic action) { return error; -} \ No newline at end of file +} diff --git a/lib/redux/fireMapReducer.dart b/lib/redux/fireMapReducer.dart index d5754cd..cc478f3 100644 --- a/lib/redux/fireMapReducer.dart +++ b/lib/redux/fireMapReducer.dart @@ -5,9 +5,9 @@ import '../models/fireMapState.dart'; import '../models/yourLocation.dart'; import 'actions.dart'; -final Reducer fireMapReducer = combineReducers(>[ - TypedReducer( - _showYourLocationMap), +final Reducer fireMapReducer = + combineReducers(>[ + TypedReducer(_showYourLocationMap), TypedReducer( _showFireNotificationMap), TypedReducer( @@ -15,8 +15,7 @@ final Reducer fireMapReducer = combineReducers((_subscribeYourLocationMap), TypedReducer( _subscribeConfirmYourLocationMap), - TypedReducer( - _unsubscribeYourLocationMap), + TypedReducer(_unsubscribeYourLocationMap), TypedReducer(_editYourLocationMap), TypedReducer( _editConfirmYourLocationMap), @@ -52,7 +51,7 @@ FireMapState _showYourLocationMap( FireMapState _showFireNotificationMap( FireMapState state, ShowFireNotificationMapAction action) { - // TODO: use here you real location? + // TODO(developer): use here real location instead of notification location? final YourLocation pseudoLoc = YourLocation( id: ObjectId(), lat: action.notif.lat, diff --git a/lib/redux/fireNotificationActions.dart b/lib/redux/fireNotificationActions.dart index d464361..8c894e4 100644 --- a/lib/redux/fireNotificationActions.dart +++ b/lib/redux/fireNotificationActions.dart @@ -4,7 +4,6 @@ import '../models/fireNotification.dart'; abstract class FireNotificationActions {} class DeleteFireNotificationAction extends FireNotificationActions { - DeleteFireNotificationAction(this.notif); final FireNotification notif; } @@ -14,13 +13,11 @@ class DeleteAllFireNotificationAction extends FireNotificationActions { } class AddFireNotificationAction extends FireNotificationActions { - AddFireNotificationAction(this.notif); final FireNotification notif; } class DeletedFireNotificationAction extends FireNotificationActions { - DeletedFireNotificationAction(this.notif); final FireNotification notif; } @@ -30,32 +27,27 @@ class DeletedAllFireNotificationAction extends FireNotificationActions { } class AddedFireNotificationAction extends FireNotificationActions { - AddedFireNotificationAction(this.notif); final FireNotification notif; } class ReadFireNotificationAction extends FireNotificationActions { - ReadFireNotificationAction(this.notif); final FireNotification notif; } class ReadedFireNotificationAction extends FireNotificationActions { - ReadedFireNotificationAction(this.notif); final FireNotification notif; } class MarkFireAsFalsePositiveAction extends FireNotificationActions { - MarkFireAsFalsePositiveAction(this.notif, this.type); final FireNotification notif; final FalsePositiveType type; } class UpdatedFireNotificationAction extends FireNotificationActions { - UpdatedFireNotificationAction(this.notif); final FireNotification notif; -} \ No newline at end of file +} diff --git a/lib/redux/fireNotificationReducer.dart b/lib/redux/fireNotificationReducer.dart index 13c2ea1..402d980 100644 --- a/lib/redux/fireNotificationReducer.dart +++ b/lib/redux/fireNotificationReducer.dart @@ -3,7 +3,8 @@ import 'package:redux/redux.dart'; import '../models/fireNotification.dart'; import 'actions.dart'; -final Reducer> fireNotificationReducer = combineReducers>(>>[ +final Reducer> fireNotificationReducer = + combineReducers>(>>[ TypedReducer, AddedFireNotificationAction>( _addedFireNotification), TypedReducer, DeletedFireNotificationAction>( @@ -18,20 +19,21 @@ final Reducer> fireNotificationReducer = combineReducers< List _addedFireNotification( List notifications, AddedFireNotificationAction action) { - return List.from(notifications)..insert(0, action.notif); + return List.from(notifications)..insert(0, action.notif); } List _deletedFireNotification( List notifications, DeletedFireNotificationAction action) { - return List.from(notifications)..remove(action.notif); + return List.from(notifications)..remove(action.notif); } List _updatedFireNotification( List notifications, UpdatedFireNotificationAction action) { return notifications - .map((FireNotification notif) => notif.id == action.notif.id ? action.notif : notif) + .map((FireNotification notif) => + notif.id == action.notif.id ? action.notif : notif) .toList(); } diff --git a/lib/redux/loadedReducer.dart b/lib/redux/loadedReducer.dart index bc6860a..9d54e51 100644 --- a/lib/redux/loadedReducer.dart +++ b/lib/redux/loadedReducer.dart @@ -1,6 +1,8 @@ import 'actions.dart'; bool loadedReducer(bool isLoaded, dynamic action) { - if (action is FetchYourLocationsSucceededAction) return true; + if (action is FetchYourLocationsSucceededAction) { + return true; + } return isLoaded; } diff --git a/lib/redux/loadingReducer.dart b/lib/redux/loadingReducer.dart index c52596f..a36fe06 100644 --- a/lib/redux/loadingReducer.dart +++ b/lib/redux/loadingReducer.dart @@ -1,6 +1,8 @@ import 'actions.dart'; bool loadingReducer(bool isLoading, dynamic action) { - if (action is FetchYourLocationsAction) return true; + if (action is FetchYourLocationsAction) { + return true; + } return isLoading; } diff --git a/lib/redux/userReducer.dart b/lib/redux/userReducer.dart index 2dfbb0a..fca4dbc 100644 --- a/lib/redux/userReducer.dart +++ b/lib/redux/userReducer.dart @@ -2,9 +2,14 @@ import '../models/user.dart'; import 'actions.dart'; User userReducer(User user, dynamic action) { - if (action is OnUserCreatedAction) + if (action is OnUserCreatedAction) { return user.copyWith(userId: action.userId); - if (action is OnUserTokenAction) return user.copyWith(token: action.token); - if (action is OnUserLangAction) return user.copyWith(lang: action.lang); + } + if (action is OnUserTokenAction) { + return user.copyWith(token: action.token); + } + if (action is OnUserLangAction) { + return user.copyWith(lang: action.lang); + } return user; } diff --git a/lib/redux/yourLocationsReducer.dart b/lib/redux/yourLocationsReducer.dart index 75db529..7ae0bdc 100644 --- a/lib/redux/yourLocationsReducer.dart +++ b/lib/redux/yourLocationsReducer.dart @@ -3,9 +3,9 @@ import 'package:redux/redux.dart'; import '../models/yourLocation.dart'; import 'actions.dart'; -final Reducer> yourLocationsReducer = combineReducers>(>>[ - TypedReducer, AddedYourLocationAction>( - _addedYourLocation), +final Reducer> yourLocationsReducer = + combineReducers>(>>[ + TypedReducer, AddedYourLocationAction>(_addedYourLocation), TypedReducer, DeletedYourLocationAction>( _deletedYourLocation), TypedReducer, UpdatedYourLocationAction>( @@ -16,7 +16,7 @@ final Reducer> yourLocationsReducer = combineReducers _addedYourLocation( List yourLocations, AddedYourLocationAction action) { - return List.from(yourLocations)..add(action.loc); + return List.from(yourLocations)..add(action.loc); } List _deletedYourLocation(