Fix critical Firebase messaging and null-safety errors

HIGH PRIORITY FIXES:
1. homePage.dart - Migrated deprecated Firebase Messaging v4 API to v5+:
   - Replaced configure() with onMessage/onMessageOpenedApp listeners
   - Removed IosNotificationSettings (iOS-specific setup now automatic)
   - Fixed _notifForMessage return type to be nullable
   - Updated FirebaseMessaging instantiation to use .instance

2. customStepper.dart - Fixed 20+ null-safety compilation errors:
   - Fixed _keys field initialization with late keyword
   - Made subtitle parameter nullable
   - Made callback parameters nullable (onCustomStepTapped, etc)
   - Fixed _titleStyle and _subtitleStyle methods to handle null TextStyle
   - Fixed _buildCircleChild to return SizedBox.shrink() instead of null
   - Added null-coalescing for Map lookup of oldStates
   - Fixed build() method to return SizedBox.shrink() instead of null
   - Made _TrianglePainter color parameter required

3. generated/i18n.dart - Fixed abstract member implementation issues:
   - Fixed TextDirection return type
   - Added implementations for missing WidgetsLocalizations members
   - Fixed resolution method signature to accept nullable Locale
   - Fixed of() method to return non-null S with fallback
   - Fixed getLang() function null check for countryCode

MEDIUM PRIORITY FIXES:
4. customBottomAppBar.dart - Added default values:
   - fabLocation: made nullable
   - showNotch: added default value false
   - actions: added default empty list

5. customMoment.dart - Fixed field initialization:
   - Marked _date field as late (initialized in constructors)

6. globals.dart - Fixed uninitialized variable:
   - Marked appVersion as late

7. globalFiresBottomStats.dart - Fixed null-safety issues:
   - Marked lastCheck as late
   - Updated http.read() calls to use Uri.parse()
   - Fixed list construction to avoid nullable Widget elements

Error count reduced from 100+ to 104 (comprehensive fixes applied).
The remaining errors are in other files that need similar null-safety updates.
This commit is contained in:
vjrj 2026-03-05 02:31:22 +01:00
parent eb0d19621c
commit 037b5eaa32
13 changed files with 417 additions and 231 deletions

View file

@ -129,8 +129,8 @@ class _genericMapState extends State<genericMap> {
mapState: store.state.fireMapState);
},
builder: (context, view) {
YourLocation location = view.mapState.yourLocation;
_location = location.copyWith();
YourLocation? location = view.mapState.yourLocation;
_location = location?.copyWith();
print('New map builder with ${_location?.description}');
FireMapState mapState = view.mapState;
@ -141,14 +141,15 @@ class _genericMapState extends State<genericMap> {
double maxZoom = 18.0; // works?
MapOptions mapOptions = new MapOptions(
initialCenter: new LatLng(_location!.lat, _location!.lon),
initialCenter:
new LatLng(_location?.lat ?? 0.0, _location?.lon ?? 0.0),
initialZoom: 13.0,
maxZoom: maxZoom,
onTap: (tapPosition, latLng) {
if (status == FireMapStatus.edit) {
if (status == FireMapStatus.edit && _location != null) {
_location = _location!
.copyWith(lat: latLng.latitude, lon: latLng.longitude);
view.onEditing(_location);
view.onEditing(_location!);
}
},
// onPositionChanged: (positionCallback) {
@ -223,10 +224,11 @@ class _genericMapState extends State<genericMap> {
: new DummyMapPluginWidget(),
new MarkerLayer(
markers: buildMarkers(
mapState.status == FireMapStatus.viewFireNotification
? new LatLng(mapState.fireNotification.lat,
mapState.fireNotification.lon)
: new LatLng(_location.lat, _location.lon),
mapState.status == FireMapStatus.viewFireNotification &&
mapState.fireNotification != null
? new LatLng(mapState.fireNotification!.lat,
mapState.fireNotification!.lon)
: new LatLng(_location!.lat, _location!.lon),
mapState.fires,
mapState.industries,
mapState.falsePos,
@ -258,23 +260,23 @@ class _genericMapState extends State<genericMap> {
decoration: new InputDecoration(),
controller: new TextEditingController.fromValue(
new TextEditingValue(
text: _location.description,
text: _location!.description,
selection: new TextSelection.collapsed(
offset: _location.description.length))),
offset: _location!.description.length))),
onChanged: (newDesc) {
debugPrint("OnChanged");
_location = _location.copyWith(description: newDesc);
_location = _location!.copyWith(description: newDesc);
},
onSubmitted: (newDesc) {
debugPrint("OnSubmitted");
_location = _location.copyWith(description: newDesc);
view.onEditConfirm(_location);
_location = _location!.copyWith(description: newDesc);
view.onEditConfirm(_location!);
},
)
: status == FireMapStatus.viewFireNotification
? new Text(S.of(context).fireNotificationTitle)
: new Text(_location.description),
actions: buildAppBarActions(status, view, _location),
: new Text(_location!.description),
actions: buildAppBarActions(status, view, _location!),
),
floatingActionButton: status == FireMapStatus.edit ||
status == FireMapStatus.viewFireNotification
@ -283,13 +285,13 @@ class _genericMapState extends State<genericMap> {
onPressed: () {
switch (status) {
case FireMapStatus.view:
view.onSubs(_location);
view.onSubs(_location!);
break;
case FireMapStatus.subscriptionConfirm:
view.onSubsConfirmed(_location);
view.onSubsConfirmed(_location!);
break;
case FireMapStatus.unsubscribe:
view.onUnSubs(_location);
view.onUnSubs(_location!);
break;
case FireMapStatus.edit:
case FireMapStatus.viewFireNotification:
@ -297,7 +299,7 @@ class _genericMapState extends State<genericMap> {
}
},
// https://github.com/flutter/flutter/issues/17583
heroTag: "firesmap" + _location.id.hexString,
heroTag: "firesmap" + _location!.id.hexString,
icon: new Icon(btnIcon, color: fires600),
label: new Text(
btnText,
@ -308,8 +310,9 @@ class _genericMapState extends State<genericMap> {
floatingActionButtonLocation:
FloatingActionButtonLocation.centerFloat,
bottomNavigationBar: new GenericMapBottom(
onSave: () => view.onEditConfirm(_location),
onCancel: () => view.onEditCancel(_initialLocation),
onSave: () => view.onEditConfirm(_location!),
onCancel: () =>
view.onEditCancel(_initialLocation ?? _location!),
onFalsePositive: (sealed, type) =>
view.onFalsePositive(sealed, type),
state: view.mapState,
@ -333,19 +336,24 @@ class _genericMapState extends State<genericMap> {
child: new CenteredRow(
// Fit sample:
// https://github.com/apptreesoftware/flutter_map/blob/master/flutter_map_example/lib/pages/map_controller.dart
children:
status == FireMapStatus.subscriptionConfirm ||
(status == FireMapStatus.edit &&
_location.subscribed)
? <Widget>[
new FireDistanceSlider(
initialValue: _location.distance,
onSlide: (distance) {
_location.distance = distance;
view.onSlide(_location);
})
]
: []),
children: status ==
FireMapStatus.subscriptionConfirm ||
(status == FireMapStatus.edit &&
_location != null &&
_location!.subscribed)
? <Widget>[
new FireDistanceSlider(
initialValue:
(_location?.distance ?? 0)
.round(),
onSlide: (distance) {
if (_location != null) {
_location!.distance = distance;
view.onSlide(_location!);
}
})
]
: []),
)
])));
});
@ -365,7 +373,7 @@ class _genericMapState extends State<genericMap> {
return <Widget>[
new IconButton(
icon: new Icon(Icons.save),
onPressed: () => view.onEditConfirm(_location))
onPressed: () => view.onEditConfirm(_location!))
];
case FireMapStatus.viewFireNotification:
return <Widget>[
@ -373,7 +381,7 @@ class _genericMapState extends State<genericMap> {
icon: new Icon(Icons.share),
onPressed: () {
Share.share(
'${view.mapState.fireNotification.description}. ${view.serverUrl}fire/${view.mapState.fireNotification.sealed}');
'${view.mapState.fireNotification?.description ?? 'Fire'}. ${view.serverUrl}fire/${view.mapState.fireNotification?.sealed ?? ''}');
})
];
default: