Los dos jobs de ci.yml fallaban desde julio, y no era por los secretos:
- `flutter analyze` exige que existan los assets declarados en pubspec, y
private-settings*.json están en .gitignore. El workflow los crea vacíos: para
analizar basta con que existan.
- test/file_test.dart usaba package:test y llamaba a getFileNameOfLang, que lee
del rootBundle; sin binding moría, y con binding se quedaba colgado esperando
al canal de assets. getFileNameOfLang acepta ahora un AssetBundle inyectable y
el test usa uno de mentira, lo que además permite cubrir el idioma de respaldo
y el fichero base.
- SDK de Dart a >=3.8.0, que es lo que piden los generadores actuales.
Reproducido antes y después en la misma imagen del runner
(ghcr.io/cirruslabs/flutter:3.41.9): ANALYZE_EXIT=1/TEST_EXIT=1 -> ambos en verde.
libsentry.so y libsentry-android.so de sentry_flutter 7.x se publican
alineadas a 4 KB, lo que hace que Play rechace la subida desde nov 2025.
La 9.x no entra todavía: exige web ^1.1.0 y chocaría con firebase_core 2 /
firebase_messaging 14.
- sentry_flutter ^7.18.0 -> ^8.14.0 y package_info_plus ^6 -> ^8 (la 6.x
fija web <=0.6.0), con el SDK de Dart a >=3.5.0
- android/build.gradle: AGP ya viene del plugins DSL de settings.gradle, así
que se queda solo el classpath de google-services. El override de
languageVersion se mantiene (sentry 8.x fija 1.6 y Kotlin 2.2 lo rechaza),
subido a 1.9
Verificado sobre el AAB: 15/15 librerías nativas con p_align >= 16384 y
targetSdkVersion=36.
Remove the external comunes-flutter library dependency and replace all its
components with local implementations:
- Utility functions: Created lib/utils/widget_utils.dart with compactWidgets()
and ellipse() functions, replacing the comunes-flutter helpers with modern
Dart null-safety patterns (whereType instead of where(notNull))
- Secret loader: Inlined as lib/utils/secret_loader.dart for loading JSON config
- Layout widgets: Replaced CenteredRow/CenteredColumn with standard Row/Column
with MainAxisAlignment.center
- Intro screens: Copied AppIntroPage and MaterialAppWithIntro locally in
lib/widgets/ with cleaned-up deprecated code patterns
- Button widget: Created lib/widgets/rounded_btn.dart for the RoundedBtn used
in activeFires.dart
Changes span 20 files:
- 5 new utility/widget files created
- Updated imports in 15 files
- Removed path dependency from pubspec.yaml
- All functionality preserved, build verified with flutter pub get
Impact:
- Removes external dependency, simplifying project structure
- Modern Dart patterns (proper null-safety)
- Better code clarity with explicit widget properties
- Easier onboarding (no 'what is comunes-flutter?' questions)
- Fix AppState: remove removed connectivity package, fix imports (latlong2), make nullable fields optional
- Fix User model: use const empty strings in const constructor instead of null
- Fix model builders: add required ObjectId parameters to YourLocation and FireNotification
- Implement Comparable instead of extending it for BasicLocation
- Fix nullable callback handling in appActions and middleware (Completer<Null>?)
- Add null checks for BuildContext in dialogs (fireAlert, homePage, etc.)
- Fix nullable scaffold state access using ?. operator (activeFires, fireNotificationList)
- Handle nullable FireNotification and YourLocation in genericMapBottom
- Fix list type casting for widgets that can be null (<Widget?> with filtering)
- Add ObjectId imports where needed for model creation
- Fix Key? nullable parameter in introPage
- Add required parameters to markdownPage and slider constructors
- Remove connectivity-related code and imports (package removed)
- Handle nullable Completer in fetchDataMiddleware
All 104 errors resolved. 0 errors, 61 warnings/info remaining.