todos-contra-el-fuego-mobile/lib/widgets/material_app_with_intro.dart
vjrj 2bf42ce262 refactor: remove comunes-flutter dependency and inline components
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)
2026-03-07 18:19:33 +01:00

84 lines
2.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:async';
abstract class MaterialAppWithIntro extends StatelessWidget {
final String name;
final ThemeData theme;
final Map<String, WidgetBuilder> routes;
final WidgetBuilder introWidget;
final WidgetBuilder continueWidget;
final String prefsKey;
MaterialAppWithIntro(this.name, this.theme, this.routes, this.introWidget,
this.continueWidget, this.prefsKey);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MaterialAppWithIntroHome(introWidget, continueWidget, prefsKey),
title: name,
theme: theme,
routes: routes,
);
}
}
class MaterialAppWithIntroHome extends StatefulWidget {
final WidgetBuilder introWidget;
final WidgetBuilder continueWidget;
final String prefsKey;
const MaterialAppWithIntroHome(
this.introWidget, this.continueWidget, this.prefsKey);
@override
_MaterialAppWithIntroState createState() =>
_MaterialAppWithIntroState(introWidget, continueWidget, prefsKey);
}
class _MaterialAppWithIntroState extends State<MaterialAppWithIntroHome> {
final WidgetBuilder introWidget;
final WidgetBuilder continueWidget;
final String prefsKey;
_MaterialAppWithIntroState(
this.introWidget, this.continueWidget, this.prefsKey);
@override
void initState() {
super.initState();
Timer(const Duration(milliseconds: 1000), () {
checkFirstStart();
});
}
// https://stackoverflow.com/questions/50654195/flutter-one-time-intro-screen
Future<void> checkFirstStart() async {
final String initialWizardKey = prefsKey;
final SharedPreferences prefs = await SharedPreferences.getInstance();
final bool showInitialWizard = (prefs.getBool(initialWizardKey) ?? true);
if (showInitialWizard) {
await prefs.setBool(initialWizardKey, false);
if (mounted) {
await Navigator.of(context)
.pushReplacement(MaterialPageRoute(builder: introWidget));
}
} else {
if (mounted) {
await Navigator.of(context)
.pushReplacement(MaterialPageRoute(builder: continueWidget));
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
}
}