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:
vjrj 2026-03-06 10:47:12 +01:00
parent 989238bf76
commit 1864e5b105
24 changed files with 153 additions and 114 deletions

View file

@ -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;

View file

@ -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());

View file

@ -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(

View file

@ -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
View 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');
}

View file

@ -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);

View file

@ -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));
} }

View file

@ -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([]),
); );

View file

@ -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(),

View file

@ -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,

View file

@ -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,

View file

@ -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>{

View file

@ -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;
}); });

View file

@ -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,

View file

@ -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,

View file

@ -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>{

View file

@ -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;
}); });

View file

@ -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(")", ""));
} }

View file

@ -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,

View file

@ -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) {

View file

@ -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) {

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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('');