todos-contra-el-fuego-mobile/lib/globalFiresBottomStats.dart
vjrj 1864e5b105 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
2026-03-06 10:47:12 +01:00

71 lines
2.1 KiB
Dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:http/http.dart' as http;
import 'colors.dart';
import 'customBottomAppBar.dart';
import 'customMoment.dart';
import 'generated/i18n.dart';
class GlobalFiresBottomStats extends StatefulWidget {
@override
_GlobalFiresBottomStatsState createState() => _GlobalFiresBottomStatsState();
}
class _GlobalFiresBottomStatsState extends State<GlobalFiresBottomStats> {
late String lastCheck;
int activeFires = 0;
final firesApiUrl = GetIt.instance<String>(instanceName: "firesApiUrl");
@override
void initState() {
super.initState();
http.read(Uri.parse('${firesApiUrl}status/last-fire-check')).then((result) {
try {
var now = Moment.now();
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'] as num).toInt();
setState(() {
lastCheck = now.from(context, last);
activeFires = count;
});
} catch (e) {
print('Cannot get the last fire stats');
print(e);
}
});
} catch (e) {
print('Cannot get the last fire check');
print(e);
}
});
}
@override
Widget build(BuildContext context) {
final List<Widget> actionWidgets = <Widget>[];
if (activeFires > 0) {
actionWidgets.add(new Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
new Text(
S.of(context).activeFiresWorldWide(activeFires.toString())),
new Text(S.of(context).updatedLastCheck(lastCheck))
]));
}
return new CustomBottomAppBar(
fabLocation: FloatingActionButtonLocation.centerDocked,
showNotch: true,
color: fires100,
mainAxisAlignment: MainAxisAlignment.center,
actions: actionWidgets);
}
}